)]}'
{".zuul.yaml":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8a4ee3a4f7206ee68b4ff1e1ae0c9c9bf00d489f","unresolved":true,"context_lines":[{"line_number":90,"context_line":"    parent: neutron-ovs-tempest-dvr-ha-multinode-full"},{"line_number":91,"context_line":"    roles:"},{"line_number":92,"context_line":"      - zuul: openstack/devstack"},{"line_number":93,"context_line":"    run: playbooks/fix_ha_confs_permissions.yaml"},{"line_number":94,"context_line":"    required-projects:"},{"line_number":95,"context_line":"      - openstack/neutron"},{"line_number":96,"context_line":"      - openstack/neutron-fwaas"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"5463eac1_23b2b453","line":93,"range":{"start_line":93,"start_character":4,"end_line":93,"end_character":48},"updated":"2026-08-24 13:18:55.000000000","message":"This is wrong:\n* The HA config directory should be already accessible by Neutron. The `/opt/stack/data/neutron/` directory and the future `ha_confs/\u003crouter-id\u003e/` should be owned by \"stack:stack\" with 755 permissions.\n* This is overriding any other `run` playbook","commit_id":"69ec06fe9ce4a55655aeee449f297fea2fb0b764"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"75cd61e147fe9e11130df3e939bc4bd6ac82ab1e","unresolved":false,"context_lines":[{"line_number":90,"context_line":"    parent: neutron-ovs-tempest-dvr-ha-multinode-full"},{"line_number":91,"context_line":"    roles:"},{"line_number":92,"context_line":"      - zuul: openstack/devstack"},{"line_number":93,"context_line":"    run: playbooks/fix_ha_confs_permissions.yaml"},{"line_number":94,"context_line":"    required-projects:"},{"line_number":95,"context_line":"      - openstack/neutron"},{"line_number":96,"context_line":"      - openstack/neutron-fwaas"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"1738b1de_0c18d1db","line":93,"range":{"start_line":93,"start_character":4,"end_line":93,"end_character":48},"in_reply_to":"5463eac1_23b2b453","updated":"2026-08-26 05:13:15.000000000","message":"You\u0027re right, but I don\u0027t know why I got permission errors. \nI\u0027ll remove it and check it again.","commit_id":"69ec06fe9ce4a55655aeee449f297fea2fb0b764"}],"/PATCHSET_LEVEL":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"7060d7969002a352900eef675627fdce45d25eb8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"92b49017_87395e35","updated":"2026-06-08 09:24:26.000000000","message":"In order to validate this huge patch, it would be needed some tempest testing with OVS + DVR L3 agent + iptables agent.\n\nCurrently we don\u0027t have a CI job with this configuration. Something inheriting from `neutron-ovs-tempest-dvr-ha-multinode-full`, using q-fwaas-v2 will be needed","commit_id":"2ed40b8d053108dc47a0a6d52ef18e065280d3e8"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"3f4b5d696ce508dcf9da3c703fe009b2be8c9c23","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"9e549e4d_28cc7d4b","in_reply_to":"241be658_bcf004e0","updated":"2026-06-15 08:17:13.000000000","message":"As commented before, the issue here is that there is no CI job running fwaas in a multinode env with DVR. ` neutron-fwaas-v2-dsvm-tempest-multinode` inherits from `neutron-ovs-tempest-multinode-full`, that is not DVR. You can create a sibling inheriting from `neutron-ovs-tempest-dvr-ha-multinode-full`.\n\nThis job can be located in the experimental or periodic queue","commit_id":"2ed40b8d053108dc47a0a6d52ef18e065280d3e8"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"6d2b0c3890c8a280197437ce221f01fb23e5db09","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":20,"id":"241be658_bcf004e0","in_reply_to":"92b49017_87395e35","updated":"2026-06-09 05:04:10.000000000","message":"Please advise me on what exactly I should do next.\nI fully tested the change in my environment, and it worked properly.","commit_id":"2ed40b8d053108dc47a0a6d52ef18e065280d3e8"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":21,"id":"7b1c28c4_04bed99a","updated":"2026-06-23 08:31:16.000000000","message":"please check unit tests as failures there are most likely related to this patch","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"3f5554a6f3c039cbc83b88aee7bbbdd0cae35556","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":26,"id":"8b7ed7c0_04f44d4e","updated":"2026-08-03 17:49:24.000000000","message":"check experimental","commit_id":"3f97aca100b6fc9425c279030a72b5dea5836e23"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"6d96b6b65452bb85ec3b3672249bc08cd80a7e51","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":27,"id":"3d64741e_c5bcbbc2","updated":"2026-08-05 06:29:39.000000000","message":"check experimental","commit_id":"d4c3a356575f428d315ff636c2d374c0f75f2f19"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"8b1cd524b6dfb4f1ea40988f707bce6f75271c4c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":28,"id":"84b56bd3_727299f3","updated":"2026-08-05 16:56:14.000000000","message":"check experimental","commit_id":"5a53cc94f70b4ed405d77bb83f0f68d88ef6328b"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"c7aa65e1dd71f63d053bfe0dcfb2307bf8d6ebef","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":29,"id":"120725f4_48ff0a7c","updated":"2026-08-08 16:14:35.000000000","message":"check experimental","commit_id":"e9af5e3036fa022f8532b36e9ae9b9cbd781b9b3"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"5010988c3c56f141c202aa6a5ec5f32d17a907a2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"e69f8d76_66fab1ba","updated":"2026-08-19 09:41:50.000000000","message":"This looks good for me but I think it deserves also for the release note. Can you add one?","commit_id":"7b514773bb0f6c204597e59e79aeab2db09f9bd5"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"0cacaed57414db4a10a203615649618e82f127b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"e36d204c_2d2be58c","updated":"2026-08-09 07:52:15.000000000","message":"check experimental","commit_id":"7b514773bb0f6c204597e59e79aeab2db09f9bd5"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"f3099ed8347d25206d1940b4b420af6697b4af42","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":30,"id":"9b7c2df3_0fb9521c","in_reply_to":"e69f8d76_66fab1ba","updated":"2026-08-23 10:12:44.000000000","message":"Yes, of course.","commit_id":"7b514773bb0f6c204597e59e79aeab2db09f9bd5"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"f37ffad334a0ef479e31f70e4b602cefad6c0c74","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"4cdb935b_e99eb6fe","updated":"2026-08-27 08:02:20.000000000","message":"Compute nodes L3 agent did not load the fwaas extension (the controller did):\n```\nWARNING stevedore.named [-] Could not load fwaas_v2\nINFO neutron.agent.agent_extensions_manager [-] Loaded agent extensions: []\n```","commit_id":"428cc4f2a2276210bc3f89df7fcb02b5974a1a19"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"a7012dfbb65fa96d9ad49bce1d6cb617fe86a541","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"99683186_a3c57dad","updated":"2026-08-27 07:29:19.000000000","message":"The `neutron-tempest-plugin-fwaas-openvswitch` job issue was random. We need to improve it but it works.\n\nWhat is not working is the job added in this patch `neutron-fwaas-v2-dsvm-tempest-multinode-dvr`.","commit_id":"428cc4f2a2276210bc3f89df7fcb02b5974a1a19"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"df3163841e661ac00fdc076cd043c4bdb54c05c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"6e9a03fe_63291b8a","updated":"2026-08-26 21:03:30.000000000","message":"check experimental","commit_id":"428cc4f2a2276210bc3f89df7fcb02b5974a1a19"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"6395bf71e23a0cf1616ed3e28f74def933139b9c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"975ad92a_1db1af6a","updated":"2026-08-26 14:49:29.000000000","message":"check experimental","commit_id":"428cc4f2a2276210bc3f89df7fcb02b5974a1a19"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"86cb765a6fd2df0ef2b6121469036cb740742b8b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":32,"id":"7df2fc3d_02baf497","updated":"2026-08-26 15:23:32.000000000","message":"recheck neutron-tempest-plugin-fwaas-openvswitch","commit_id":"428cc4f2a2276210bc3f89df7fcb02b5974a1a19"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"9fc17e3a226025f170906f3e28caa8e3e18d2dd7","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":33,"id":"6d8367ab_29f55b09","updated":"2026-08-27 22:36:56.000000000","message":"check experimental","commit_id":"8ba5a879f5de8fd0a05d93f970e0f57b25a4bd2e"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"64eb6d46c9c23944b160f29dfa199a96474d55b0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":34,"id":"9151af83_8f47c6df","updated":"2026-08-29 10:13:31.000000000","message":"check experimental","commit_id":"d326489013636d6e10ad20ef4d50948813e9bb91"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"ca649605d468648f89d601b24d8b670dba0e8694","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":35,"id":"6cefb0d2_cbdc2efa","updated":"2026-08-29 12:45:16.000000000","message":"check experimental","commit_id":"ea1e2789af2c4daa407bb0861d8e5c011d15f91b"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"17d22788ccf038833241a088f25722ff073746b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":36,"id":"6a9fbd4f_2f9ef585","updated":"2026-08-29 18:32:33.000000000","message":"check experimental","commit_id":"4f3238056acfc36ed25c07bfb0e6d2e4d82dd695"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"5f09b9267d1e92e9b1bb437f14e36976cec8fe49","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":37,"id":"900fccbd_dad5a73c","updated":"2026-08-31 07:31:33.000000000","message":"check experimental","commit_id":"22d267f19737b45d15c2053466a5c05e61568082"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"9b23803dbb76411ed6fb1ceab8375b9ae06da367","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"1f123907_99a932dd","updated":"2026-08-31 08:27:39.000000000","message":"check experimental","commit_id":"940d5600c830803f06cc4c2a1c2e5fab65df812e"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"778a3291d3bfd79a27b54e68a0948c38bb1737e0","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":40,"id":"be82c571_0d261411","updated":"2026-09-18 14:49:45.000000000","message":"check experimental","commit_id":"ccad49495fa69aa0a86fd01daa31603089bbf22a"}],"neutron_fwaas/services/firewall/service_drivers/agents/drivers/linux/iptables_fwaas_v2.py":[{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"e312e02e5b4d4199ab645cc89eaaf729bb6e3758","unresolved":false,"context_lines":[{"line_number":81,"context_line":"                # Flush conntrack for all ports in this firewall group"},{"line_number":82,"context_line":"                for ri, _ in apply_list:"},{"line_number":83,"context_line":"                    ipt_if_prefix_list \u003d self._get_ipt_mgrs_with_if_prefix("},{"line_number":84,"context_line":"                      agent_mode,ri)"},{"line_number":85,"context_line":"                    for ipt_if_prefix in ipt_if_prefix_list:"},{"line_number":86,"context_line":"                        if ipt_if_prefix[\u0027if_prefix\u0027] \u003d\u003d SNAT_INT_DEV_PREFIX:"},{"line_number":87,"context_line":"                            for port_id in firewall.get(\u0027ports\u0027, []):"}],"source_content_type":"text/x-python","patch_set":5,"id":"5cf52ed4_8f497abe","line":84,"in_reply_to":"1cda6d07_af416e20","updated":"2026-05-24 11:22:31.000000000","message":"Done","commit_id":"1988d36699821af19eb99cc1d11d04703a5c521d"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"b6ad6027dd3356a813b025e5e238e4f7fd8f5fa7","unresolved":true,"context_lines":[{"line_number":81,"context_line":"                # Flush conntrack for all ports in this firewall group"},{"line_number":82,"context_line":"                for ri, _ in apply_list:"},{"line_number":83,"context_line":"                    ipt_if_prefix_list \u003d self._get_ipt_mgrs_with_if_prefix("},{"line_number":84,"context_line":"                      agent_mode,ri)"},{"line_number":85,"context_line":"                    for ipt_if_prefix in ipt_if_prefix_list:"},{"line_number":86,"context_line":"                        if ipt_if_prefix[\u0027if_prefix\u0027] \u003d\u003d SNAT_INT_DEV_PREFIX:"},{"line_number":87,"context_line":"                            for port_id in firewall.get(\u0027ports\u0027, []):"}],"source_content_type":"text/x-python","patch_set":5,"id":"1cda6d07_af416e20","line":84,"in_reply_to":"3f6cad8c_23a6497b","updated":"2026-05-24 09:52:10.000000000","message":"\u003e pep8: E121 continuation line under-indented for hanging indent\n\ndone","commit_id":"1988d36699821af19eb99cc1d11d04703a5c521d"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":138,"context_line":"                    self._remove_default_chains(ipt_mgr)"},{"line_number":139,"context_line":"                    \"\"\" apply the changes immediately"},{"line_number":140,"context_line":"                        (no defer in firewall path)"},{"line_number":141,"context_line":"                    \"\"\""},{"line_number":142,"context_line":"                    ipt_mgr.defer_apply_off()"},{"line_number":143,"context_line":"            self.pre_firewall \u003d None"},{"line_number":144,"context_line":"        except (LookupError, RuntimeError):"}],"source_content_type":"text/x-python","patch_set":21,"id":"c89ec876_f6c774dd","line":141,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated change","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":138,"context_line":"                    self._remove_default_chains(ipt_mgr)"},{"line_number":139,"context_line":"                    \"\"\" apply the changes immediately"},{"line_number":140,"context_line":"                        (no defer in firewall path)"},{"line_number":141,"context_line":"                    \"\"\""},{"line_number":142,"context_line":"                    ipt_mgr.defer_apply_off()"},{"line_number":143,"context_line":"            self.pre_firewall \u003d None"},{"line_number":144,"context_line":"        except (LookupError, RuntimeError):"}],"source_content_type":"text/x-python","patch_set":21,"id":"be4264d5_2715d532","line":141,"in_reply_to":"c89ec876_f6c774dd","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":152,"context_line":"        try:"},{"line_number":153,"context_line":"            # Flush conntrack for newly added ports"},{"line_number":154,"context_line":"            if firewall.get(\u0027add-port-ids\u0027):"},{"line_number":155,"context_line":"                for ri, _ in apply_list:"},{"line_number":156,"context_line":"                    ipt_if_prefix_list \u003d self._get_ipt_mgrs_with_if_prefix("},{"line_number":157,"context_line":"                                                            agent_mode, ri)"},{"line_number":158,"context_line":"                    for ipt_if_prefix in ipt_if_prefix_list:"},{"line_number":159,"context_line":"                        if ipt_if_prefix[\u0027if_prefix\u0027] \u003d\u003d SNAT_INT_DEV_PREFIX:"},{"line_number":160,"context_line":"                            for port_id in firewall[\u0027add-port-ids\u0027]:"},{"line_number":161,"context_line":"                                self._flush_conntrack_for_port(ri,"},{"line_number":162,"context_line":"                                port_id, ipt_if_prefix[\u0027ipt\u0027].namespace)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if firewall[\u0027admin_state_up\u0027]:"},{"line_number":165,"context_line":"                self._setup_firewall(agent_mode, apply_list, firewall)"}],"source_content_type":"text/x-python","patch_set":21,"id":"67f3b307_dda01ad2","line":162,"range":{"start_line":155,"start_character":16,"end_line":162,"end_character":72},"updated":"2026-06-23 08:31:16.000000000","message":"nit: if I\u0027m not mistaken this is the same code as in the ``create_firewall_group`` method. Maybe you can create helper private method which will be called in both places?","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":152,"context_line":"        try:"},{"line_number":153,"context_line":"            # Flush conntrack for newly added ports"},{"line_number":154,"context_line":"            if firewall.get(\u0027add-port-ids\u0027):"},{"line_number":155,"context_line":"                for ri, _ in apply_list:"},{"line_number":156,"context_line":"                    ipt_if_prefix_list \u003d self._get_ipt_mgrs_with_if_prefix("},{"line_number":157,"context_line":"                                                            agent_mode, ri)"},{"line_number":158,"context_line":"                    for ipt_if_prefix in ipt_if_prefix_list:"},{"line_number":159,"context_line":"                        if ipt_if_prefix[\u0027if_prefix\u0027] \u003d\u003d SNAT_INT_DEV_PREFIX:"},{"line_number":160,"context_line":"                            for port_id in firewall[\u0027add-port-ids\u0027]:"},{"line_number":161,"context_line":"                                self._flush_conntrack_for_port(ri,"},{"line_number":162,"context_line":"                                port_id, ipt_if_prefix[\u0027ipt\u0027].namespace)"},{"line_number":163,"context_line":""},{"line_number":164,"context_line":"            if firewall[\u0027admin_state_up\u0027]:"},{"line_number":165,"context_line":"                self._setup_firewall(agent_mode, apply_list, firewall)"}],"source_content_type":"text/x-python","patch_set":21,"id":"e617948a_caca1757","line":162,"range":{"start_line":155,"start_character":16,"end_line":162,"end_character":72},"in_reply_to":"67f3b307_dda01ad2","updated":"2026-07-21 06:56:24.000000000","message":"You\u0027re right. I considered your suggestion in the last patchset. \nthank you","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":192,"context_line":"                    if_prefix \u003d ipt_if_prefix[\u0027if_prefix\u0027]"},{"line_number":193,"context_line":"                    self._remove_chains(fwid, ipt_mgr)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"                    if if_prefix \u003d\u003d SNAT_INT_DEV_PREFIX:"},{"line_number":196,"context_line":"                        # For SNAT, we never remove the shared default chain"},{"line_number":197,"context_line":"                        if not self._chain_exists("},{"line_number":198,"context_line":"                                  ipt_mgr, IPV4, FWAAS_DEFAULT_CHAIN):"},{"line_number":199,"context_line":"                            self._add_default_policy_chain_v4v6(ipt_mgr)"},{"line_number":200,"context_line":"                        self._add_accepted_chain_v4v6(ipt_mgr)"},{"line_number":201,"context_line":"                        self._add_dropped_chain_v4v6(ipt_mgr)"},{"line_number":202,"context_line":"                        self._add_rejected_chain_v4v6(ipt_mgr)"},{"line_number":203,"context_line":"                    else:"},{"line_number":204,"context_line":"                        self._remove_default_chains(ipt_mgr)"},{"line_number":205,"context_line":"                        self._add_default_policy_chain_v4v6(ipt_mgr)"},{"line_number":206,"context_line":"                        self._add_accepted_chain_v4v6(ipt_mgr)"},{"line_number":207,"context_line":"                        self._add_dropped_chain_v4v6(ipt_mgr)"},{"line_number":208,"context_line":"                        self._add_rejected_chain_v4v6(ipt_mgr)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"                    self._enable_policy_chain(fwid, ipt_if_prefix,"},{"line_number":211,"context_line":"                              router_fw_ports, ri.router[\u0027id\u0027], ri)"}],"source_content_type":"text/x-python","patch_set":21,"id":"12d97478_b2910c58","line":208,"range":{"start_line":195,"start_character":20,"end_line":208,"end_character":62},"updated":"2026-06-23 08:31:16.000000000","message":"this is just my personal \"taste\" but I would do it like:\n\n    if if_prefix !\u003d SNAT_INT_DEV_PREFIX:\n        self._remove_default_chains(ipt_mgr)\n        self._add_default_policy_chain_v4v6(ipt_mgr)\n    elif not self._chain_exists(ipt_mgr, IPV4, FWAAS_DEFAULT_CHAIN):\n        self._add_default_policy_chain_v4v6(ipt_mgr)\n        \n    self._add_accepted_chain_v4v6(ipt_mgr)\n    self._add_dropped_chain_v4v6(ipt_mgr)\n    self._add_rejected_chain_v4v6(ipt_mgr)\n   \n   \nThis is not big deal but IMHO that way it is easier to see what are the differences between SNAT prefix and other router ports.","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":192,"context_line":"                    if_prefix \u003d ipt_if_prefix[\u0027if_prefix\u0027]"},{"line_number":193,"context_line":"                    self._remove_chains(fwid, ipt_mgr)"},{"line_number":194,"context_line":""},{"line_number":195,"context_line":"                    if if_prefix \u003d\u003d SNAT_INT_DEV_PREFIX:"},{"line_number":196,"context_line":"                        # For SNAT, we never remove the shared default chain"},{"line_number":197,"context_line":"                        if not self._chain_exists("},{"line_number":198,"context_line":"                                  ipt_mgr, IPV4, FWAAS_DEFAULT_CHAIN):"},{"line_number":199,"context_line":"                            self._add_default_policy_chain_v4v6(ipt_mgr)"},{"line_number":200,"context_line":"                        self._add_accepted_chain_v4v6(ipt_mgr)"},{"line_number":201,"context_line":"                        self._add_dropped_chain_v4v6(ipt_mgr)"},{"line_number":202,"context_line":"                        self._add_rejected_chain_v4v6(ipt_mgr)"},{"line_number":203,"context_line":"                    else:"},{"line_number":204,"context_line":"                        self._remove_default_chains(ipt_mgr)"},{"line_number":205,"context_line":"                        self._add_default_policy_chain_v4v6(ipt_mgr)"},{"line_number":206,"context_line":"                        self._add_accepted_chain_v4v6(ipt_mgr)"},{"line_number":207,"context_line":"                        self._add_dropped_chain_v4v6(ipt_mgr)"},{"line_number":208,"context_line":"                        self._add_rejected_chain_v4v6(ipt_mgr)"},{"line_number":209,"context_line":""},{"line_number":210,"context_line":"                    self._enable_policy_chain(fwid, ipt_if_prefix,"},{"line_number":211,"context_line":"                              router_fw_ports, ri.router[\u0027id\u0027], ri)"}],"source_content_type":"text/x-python","patch_set":21,"id":"e6cb3717_8a30606b","line":208,"range":{"start_line":195,"start_character":20,"end_line":208,"end_character":62},"in_reply_to":"12d97478_b2910c58","updated":"2026-07-21 06:56:24.000000000","message":"Thank you for the suggestion — you are right that the if prefix !\u003d SNAT / elif / shared calls form is clearer because it makes the common path (the three _add_*_chain calls) visible at a glance rather than duplicated inside each branch. I have adopted your style exactly in the new _setup_default_chains helper that replaces both duplicate blocks.","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":210,"context_line":"                    self._enable_policy_chain(fwid, ipt_if_prefix,"},{"line_number":211,"context_line":"                              router_fw_ports, ri.router[\u0027id\u0027], ri)"},{"line_number":212,"context_line":"                    \"\"\" apply the changes immediately"},{"line_number":213,"context_line":"                        (no defer in firewall path) \"\"\""},{"line_number":214,"context_line":"                    ipt_mgr.defer_apply_off()"},{"line_number":215,"context_line":"        except (LookupError, RuntimeError):"},{"line_number":216,"context_line":"            # catch known library exceptions and raise Fwaas generic exception"}],"source_content_type":"text/x-python","patch_set":21,"id":"8aba74f1_2becaefa","line":213,"updated":"2026-06-23 08:31:16.000000000","message":"nit: not related change (comment)","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":210,"context_line":"                    self._enable_policy_chain(fwid, ipt_if_prefix,"},{"line_number":211,"context_line":"                              router_fw_ports, ri.router[\u0027id\u0027], ri)"},{"line_number":212,"context_line":"                    \"\"\" apply the changes immediately"},{"line_number":213,"context_line":"                        (no defer in firewall path) \"\"\""},{"line_number":214,"context_line":"                    ipt_mgr.defer_apply_off()"},{"line_number":215,"context_line":"        except (LookupError, RuntimeError):"},{"line_number":216,"context_line":"            # catch known library exceptions and raise Fwaas generic exception"}],"source_content_type":"text/x-python","patch_set":21,"id":"c972f92c_a5d0803a","line":213,"in_reply_to":"8aba74f1_2becaefa","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":240,"context_line":"                    self._add_default_policy_chain_v4v6(ipt_mgr)"},{"line_number":241,"context_line":"                    self._add_accepted_chain_v4v6(ipt_mgr)"},{"line_number":242,"context_line":"                    self._add_dropped_chain_v4v6(ipt_mgr)"},{"line_number":243,"context_line":"                    self._add_rejected_chain_v4v6(ipt_mgr)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"                self._setup_chains(firewall, ipt_if_prefix, router_fw_ports)"},{"line_number":246,"context_line":"                self._enable_policy_chain(fwid, ipt_if_prefix,"}],"source_content_type":"text/x-python","patch_set":21,"id":"0c54a260_f963c88e","line":243,"updated":"2026-06-23 08:31:16.000000000","message":"same comment as above. Also again I think that this code is exactly the same in both methods so maybe you could create helper method to reuse it in both places","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":240,"context_line":"                    self._add_default_policy_chain_v4v6(ipt_mgr)"},{"line_number":241,"context_line":"                    self._add_accepted_chain_v4v6(ipt_mgr)"},{"line_number":242,"context_line":"                    self._add_dropped_chain_v4v6(ipt_mgr)"},{"line_number":243,"context_line":"                    self._add_rejected_chain_v4v6(ipt_mgr)"},{"line_number":244,"context_line":""},{"line_number":245,"context_line":"                self._setup_chains(firewall, ipt_if_prefix, router_fw_ports)"},{"line_number":246,"context_line":"                self._enable_policy_chain(fwid, ipt_if_prefix,"}],"source_content_type":"text/x-python","patch_set":21,"id":"57e9d997_a5737f28","line":243,"in_reply_to":"0c54a260_f963c88e","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":332,"context_line":"            return None"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        network_id \u003d internal_port.get(\u0027network_id\u0027)"},{"line_number":335,"context_line":"        if not network_id:"},{"line_number":336,"context_line":"            LOG.error(\"Internal port %s has no network_id\", internal_port_id)"},{"line_number":337,"context_line":"            return None"},{"line_number":338,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"0ef4fd13_5535d977","line":335,"updated":"2026-06-23 08:31:16.000000000","message":"how this is even possible to have port without network_id?","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":332,"context_line":"            return None"},{"line_number":333,"context_line":""},{"line_number":334,"context_line":"        network_id \u003d internal_port.get(\u0027network_id\u0027)"},{"line_number":335,"context_line":"        if not network_id:"},{"line_number":336,"context_line":"            LOG.error(\"Internal port %s has no network_id\", internal_port_id)"},{"line_number":337,"context_line":"            return None"},{"line_number":338,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"b4ee5b36_5be47a5e","line":335,"in_reply_to":"0ef4fd13_5535d977","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":416,"context_line":"                            router_fw_ports, fwid, ipt_mgr, bname):"},{"line_number":417,"context_line":"        \"\"\"Apply firewall rules to multiple qr-* interfaces.\"\"\""},{"line_number":418,"context_line":"        if_prefix \u003d ipt_if_prefix[\u0027if_prefix\u0027]"},{"line_number":419,"context_line":"        for ver in (IPV4, IPV6):"},{"line_number":420,"context_line":"            if ver \u003d\u003d IPV4:"},{"line_number":421,"context_line":"                tbl \u003d ipt_mgr.ipv4[\u0027filter\u0027]"},{"line_number":422,"context_line":"            else:"},{"line_number":423,"context_line":"                tbl \u003d ipt_mgr.ipv6[\u0027filter\u0027]"},{"line_number":424,"context_line":"            for direction in (constants.INGRESS_DIRECTION,"},{"line_number":425,"context_line":"                              constants.EGRESS_DIRECTION):"},{"line_number":426,"context_line":"                chain_name \u003d self._get_chain_name(fwid, ver, direction)"}],"source_content_type":"text/x-python","patch_set":21,"id":"f8c35ac3_0ec2b3f3","line":423,"range":{"start_line":419,"start_character":8,"end_line":423,"end_character":44},"updated":"2026-06-23 08:31:16.000000000","message":"instead of this if...else... block you can do something like:\n\n    for ver, tbl in ((IPV4, ipt_mgr.ipv4[\u0027filter\u0027]), (IPV6, ipt_mgr.ipv6[\u0027filter\u0027])):\n        ....","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":416,"context_line":"                            router_fw_ports, fwid, ipt_mgr, bname):"},{"line_number":417,"context_line":"        \"\"\"Apply firewall rules to multiple qr-* interfaces.\"\"\""},{"line_number":418,"context_line":"        if_prefix \u003d ipt_if_prefix[\u0027if_prefix\u0027]"},{"line_number":419,"context_line":"        for ver in (IPV4, IPV6):"},{"line_number":420,"context_line":"            if ver \u003d\u003d IPV4:"},{"line_number":421,"context_line":"                tbl \u003d ipt_mgr.ipv4[\u0027filter\u0027]"},{"line_number":422,"context_line":"            else:"},{"line_number":423,"context_line":"                tbl \u003d ipt_mgr.ipv6[\u0027filter\u0027]"},{"line_number":424,"context_line":"            for direction in (constants.INGRESS_DIRECTION,"},{"line_number":425,"context_line":"                              constants.EGRESS_DIRECTION):"},{"line_number":426,"context_line":"                chain_name \u003d self._get_chain_name(fwid, ver, direction)"}],"source_content_type":"text/x-python","patch_set":21,"id":"8796d947_8fb2d367","line":423,"range":{"start_line":419,"start_character":8,"end_line":423,"end_character":44},"in_reply_to":"f8c35ac3_0ec2b3f3","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8a4ee3a4f7206ee68b4ff1e1ae0c9c9bf00d489f","unresolved":true,"context_lines":[{"line_number":299,"context_line":"                fwid, ver, constants.EGRESS_DIRECTION)"},{"line_number":300,"context_line":"            table.add_rule(ochain_name, iptbl_rule)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def _get_snat_port_for_internal_port(self, ri, internal_port_id):"},{"line_number":303,"context_line":"        \"\"\"Return SNAT port dict that belongs to the same network"},{"line_number":304,"context_line":"        as the internal port."},{"line_number":305,"context_line":"        \"\"\""},{"line_number":306,"context_line":"        internal_port \u003d None"},{"line_number":307,"context_line":"        for port in getattr(ri, \u0027internal_ports\u0027, []):"},{"line_number":308,"context_line":"            if port.get(\u0027id\u0027) \u003d\u003d internal_port_id:"},{"line_number":309,"context_line":"                internal_port \u003d port"},{"line_number":310,"context_line":"                break"},{"line_number":311,"context_line":"        if not internal_port:"},{"line_number":312,"context_line":"            LOG.error("},{"line_number":313,"context_line":"                    \" Internal port %s not found \""},{"line_number":314,"context_line":"                    \"in ri.internal_ports of router %s\","},{"line_number":315,"context_line":"                    internal_port_id, ri.router[\u0027id\u0027])"},{"line_number":316,"context_line":"            return None"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        network_id \u003d internal_port.get(\u0027network_id\u0027)"},{"line_number":319,"context_line":"        if not network_id:"},{"line_number":320,"context_line":"            LOG.error(\"Internal port %s has no network_id\", internal_port_id)"},{"line_number":321,"context_line":"            return None"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        for snat_port in ri.snat_ports:"},{"line_number":324,"context_line":"            if snat_port.get(\u0027network_id\u0027) \u003d\u003d network_id:"},{"line_number":325,"context_line":"                return snat_port"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        LOG.error(\"No SNAT port found for network %s (internal port %s)\","},{"line_number":328,"context_line":"                  network_id, internal_port_id)"},{"line_number":329,"context_line":"        return None"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def _enable_policy_chain(self, fwid,"},{"line_number":332,"context_line":"                    ipt_if_prefix, router_fw_ports, router_id, ri):"}],"source_content_type":"text/x-python","patch_set":31,"id":"02d8e282_75ef49b4","line":329,"range":{"start_line":302,"start_character":3,"end_line":329,"end_character":19},"updated":"2026-08-24 13:18:55.000000000","message":"You should not reimplement `get_snat_port_for_internal_port`. This should be something like this:\n\n```\ndef _get_internal_port(self, ri, port_id):\n    for port in ri.internal_ports:\n        if port[\u0027id\u0027] \u003d\u003d port_id:\n            return port\ndef _get_snat_port_for_internal_port(self, ri, internal_port_id):\n    \"\"\"Return the SNAT (csnat) port for an internal router port.\n    Delegates subnet matching to\n    ``DvrRouterBase.get_snat_port_for_internal_port``.\n    \"\"\"\n    internal_port \u003d self._get_internal_port(ri, internal_port_id)\n    if not internal_port:\n        LOG.warning(\"Internal port %s not found on router %s\",\n                    internal_port_id, ri.router[\u0027id\u0027])\n        return\n    return ri.get_snat_port_for_internal_port(internal_port)\n```","commit_id":"69ec06fe9ce4a55655aeee449f297fea2fb0b764"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"75cd61e147fe9e11130df3e939bc4bd6ac82ab1e","unresolved":false,"context_lines":[{"line_number":299,"context_line":"                fwid, ver, constants.EGRESS_DIRECTION)"},{"line_number":300,"context_line":"            table.add_rule(ochain_name, iptbl_rule)"},{"line_number":301,"context_line":""},{"line_number":302,"context_line":"    def _get_snat_port_for_internal_port(self, ri, internal_port_id):"},{"line_number":303,"context_line":"        \"\"\"Return SNAT port dict that belongs to the same network"},{"line_number":304,"context_line":"        as the internal port."},{"line_number":305,"context_line":"        \"\"\""},{"line_number":306,"context_line":"        internal_port \u003d None"},{"line_number":307,"context_line":"        for port in getattr(ri, \u0027internal_ports\u0027, []):"},{"line_number":308,"context_line":"            if port.get(\u0027id\u0027) \u003d\u003d internal_port_id:"},{"line_number":309,"context_line":"                internal_port \u003d port"},{"line_number":310,"context_line":"                break"},{"line_number":311,"context_line":"        if not internal_port:"},{"line_number":312,"context_line":"            LOG.error("},{"line_number":313,"context_line":"                    \" Internal port %s not found \""},{"line_number":314,"context_line":"                    \"in ri.internal_ports of router %s\","},{"line_number":315,"context_line":"                    internal_port_id, ri.router[\u0027id\u0027])"},{"line_number":316,"context_line":"            return None"},{"line_number":317,"context_line":""},{"line_number":318,"context_line":"        network_id \u003d internal_port.get(\u0027network_id\u0027)"},{"line_number":319,"context_line":"        if not network_id:"},{"line_number":320,"context_line":"            LOG.error(\"Internal port %s has no network_id\", internal_port_id)"},{"line_number":321,"context_line":"            return None"},{"line_number":322,"context_line":""},{"line_number":323,"context_line":"        for snat_port in ri.snat_ports:"},{"line_number":324,"context_line":"            if snat_port.get(\u0027network_id\u0027) \u003d\u003d network_id:"},{"line_number":325,"context_line":"                return snat_port"},{"line_number":326,"context_line":""},{"line_number":327,"context_line":"        LOG.error(\"No SNAT port found for network %s (internal port %s)\","},{"line_number":328,"context_line":"                  network_id, internal_port_id)"},{"line_number":329,"context_line":"        return None"},{"line_number":330,"context_line":""},{"line_number":331,"context_line":"    def _enable_policy_chain(self, fwid,"},{"line_number":332,"context_line":"                    ipt_if_prefix, router_fw_ports, router_id, ri):"}],"source_content_type":"text/x-python","patch_set":31,"id":"826506f2_215e260d","line":329,"range":{"start_line":302,"start_character":3,"end_line":329,"end_character":19},"in_reply_to":"02d8e282_75ef49b4","updated":"2026-08-26 05:13:15.000000000","message":"Thank you. I didn\u0027t know there was such a method. \nI\u0027ll modify it in the next patch set.","commit_id":"69ec06fe9ce4a55655aeee449f297fea2fb0b764"}],"neutron_fwaas/tests/unit/services/firewall/service_drivers/agents/drivers/linux/test_iptables_fwaas_v2.py":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    # ------------------------------------------------------------------"},{"line_number":64,"context_line":"    # Helpers"},{"line_number":65,"context_line":"    # ------------------------------------------------------------------"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _fake_rules_v4(self, fwid, apply_list):"},{"line_number":68,"context_line":"        rule_list \u003d []"}],"source_content_type":"text/x-python","patch_set":21,"id":"e6538160_bee84236","line":65,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated change","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":62,"context_line":""},{"line_number":63,"context_line":"    # ------------------------------------------------------------------"},{"line_number":64,"context_line":"    # Helpers"},{"line_number":65,"context_line":"    # ------------------------------------------------------------------"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"    def _fake_rules_v4(self, fwid, apply_list):"},{"line_number":68,"context_line":"        rule_list \u003d []"}],"source_content_type":"text/x-python","patch_set":21,"id":"be161645_e2d80a2d","line":65,"in_reply_to":"e6538160_bee84236","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":202,"context_line":"        _name \u003d \"{}{}\".format(if_prefix, port_id)"},{"line_number":203,"context_line":"        return _name[:MAX_INTF_NAME_LEN]"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    # ------------------------------------------------------------------"},{"line_number":206,"context_line":"    # Core helper: build and verify expected v4 call sequence"},{"line_number":207,"context_line":"    # ------------------------------------------------------------------"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"9ff185c5_9073fe7a","line":205,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":202,"context_line":"        _name \u003d \"{}{}\".format(if_prefix, port_id)"},{"line_number":203,"context_line":"        return _name[:MAX_INTF_NAME_LEN]"},{"line_number":204,"context_line":""},{"line_number":205,"context_line":"    # ------------------------------------------------------------------"},{"line_number":206,"context_line":"    # Core helper: build and verify expected v4 call sequence"},{"line_number":207,"context_line":"    # ------------------------------------------------------------------"},{"line_number":208,"context_line":""}],"source_content_type":"text/x-python","patch_set":21,"id":"3e0a9956_3ecc90fb","line":205,"in_reply_to":"9ff185c5_9073fe7a","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":708,"context_line":""},{"line_number":709,"context_line":"    # ------------------------------------------------------------------"},{"line_number":710,"context_line":"    # DVR-SNAT tests"},{"line_number":711,"context_line":"    # ------------------------------------------------------------------"},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"    def test_create_firewall_group_with_rules_dvr_snat(self):"},{"line_number":714,"context_line":"        self._setup_firewall_with_rules("}],"source_content_type":"text/x-python","patch_set":21,"id":"e78b3f79_0ab3c915","line":711,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":708,"context_line":""},{"line_number":709,"context_line":"    # ------------------------------------------------------------------"},{"line_number":710,"context_line":"    # DVR-SNAT tests"},{"line_number":711,"context_line":"    # ------------------------------------------------------------------"},{"line_number":712,"context_line":""},{"line_number":713,"context_line":"    def test_create_firewall_group_with_rules_dvr_snat(self):"},{"line_number":714,"context_line":"        self._setup_firewall_with_rules("}],"source_content_type":"text/x-python","patch_set":21,"id":"18e1cb20_1102c8fc","line":711,"in_reply_to":"e78b3f79_0ab3c915","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    # ------------------------------------------------------------------"},{"line_number":769,"context_line":"    # DVR (compute-node) tests"},{"line_number":770,"context_line":"    # ------------------------------------------------------------------"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def test_create_firewall_group_with_rules_dvr(self):"},{"line_number":773,"context_line":"        self._setup_firewall_with_rules("}],"source_content_type":"text/x-python","patch_set":21,"id":"6e20d399_14e77108","line":770,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":767,"context_line":""},{"line_number":768,"context_line":"    # ------------------------------------------------------------------"},{"line_number":769,"context_line":"    # DVR (compute-node) tests"},{"line_number":770,"context_line":"    # ------------------------------------------------------------------"},{"line_number":771,"context_line":""},{"line_number":772,"context_line":"    def test_create_firewall_group_with_rules_dvr(self):"},{"line_number":773,"context_line":"        self._setup_firewall_with_rules("}],"source_content_type":"text/x-python","patch_set":21,"id":"31ee9c1c_6db0f280","line":770,"in_reply_to":"6e20d399_14e77108","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":814,"context_line":""},{"line_number":815,"context_line":"    # ------------------------------------------------------------------"},{"line_number":816,"context_line":"    # _get_ipt_mgrs_with_if_prefix unit tests"},{"line_number":817,"context_line":"    # ------------------------------------------------------------------"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"    def test_get_ipt_mgrs_non_distributed(self):"},{"line_number":820,"context_line":"        apply_list \u003d self._fake_apply_list(distributed\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":21,"id":"ad5a2222_d87c1775","line":817,"updated":"2026-06-23 08:31:16.000000000","message":"I don\u0027t think we need such \"titles\"","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":814,"context_line":""},{"line_number":815,"context_line":"    # ------------------------------------------------------------------"},{"line_number":816,"context_line":"    # _get_ipt_mgrs_with_if_prefix unit tests"},{"line_number":817,"context_line":"    # ------------------------------------------------------------------"},{"line_number":818,"context_line":""},{"line_number":819,"context_line":"    def test_get_ipt_mgrs_non_distributed(self):"},{"line_number":820,"context_line":"        apply_list \u003d self._fake_apply_list(distributed\u003dFalse)"}],"source_content_type":"text/x-python","patch_set":21,"id":"fd6cd64c_88b2181b","line":817,"in_reply_to":"ad5a2222_d87c1775","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    # ------------------------------------------------------------------"},{"line_number":873,"context_line":"    # _get_snat_port_for_internal_port unit tests"},{"line_number":874,"context_line":"    # ------------------------------------------------------------------"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"    def test_get_snat_port_for_internal_port_found(self):"},{"line_number":877,"context_line":"        apply_list \u003d self._fake_apply_list("}],"source_content_type":"text/x-python","patch_set":21,"id":"1fc2de78_740ab298","line":874,"updated":"2026-06-23 08:31:16.000000000","message":"ditto","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":871,"context_line":""},{"line_number":872,"context_line":"    # ------------------------------------------------------------------"},{"line_number":873,"context_line":"    # _get_snat_port_for_internal_port unit tests"},{"line_number":874,"context_line":"    # ------------------------------------------------------------------"},{"line_number":875,"context_line":""},{"line_number":876,"context_line":"    def test_get_snat_port_for_internal_port_found(self):"},{"line_number":877,"context_line":"        apply_list \u003d self._fake_apply_list("}],"source_content_type":"text/x-python","patch_set":21,"id":"e3df4754_1ff68bab","line":874,"in_reply_to":"1fc2de78_740ab298","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    # ------------------------------------------------------------------"},{"line_number":906,"context_line":"    # _flush_conntrack_for_port unit tests"},{"line_number":907,"context_line":"    # ------------------------------------------------------------------"},{"line_number":908,"context_line":""},{"line_number":909,"context_line":"    def test_flush_conntrack_for_port_calls_delete_entries(self):"},{"line_number":910,"context_line":"        apply_list \u003d self._fake_apply_list("}],"source_content_type":"text/x-python","patch_set":21,"id":"067329bb_41a5616a","line":907,"updated":"2026-06-23 08:31:16.000000000","message":"ditto","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":904,"context_line":""},{"line_number":905,"context_line":"    # ------------------------------------------------------------------"},{"line_number":906,"context_line":"    # _flush_conntrack_for_port unit tests"},{"line_number":907,"context_line":"    # ------------------------------------------------------------------"},{"line_number":908,"context_line":""},{"line_number":909,"context_line":"    def test_flush_conntrack_for_port_calls_delete_entries(self):"},{"line_number":910,"context_line":"        apply_list \u003d self._fake_apply_list("}],"source_content_type":"text/x-python","patch_set":21,"id":"97b6f6b4_ee8ceff0","line":907,"in_reply_to":"067329bb_41a5616a","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":931,"context_line":""},{"line_number":932,"context_line":"    # ------------------------------------------------------------------"},{"line_number":933,"context_line":"    # Conntrack flush tests"},{"line_number":934,"context_line":"    # ------------------------------------------------------------------"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"    def test_remove_conntrack_new_firewall(self):"},{"line_number":937,"context_line":"        apply_list \u003d self._fake_apply_list()"}],"source_content_type":"text/x-python","patch_set":21,"id":"d4f24bb1_40ce05c1","line":934,"updated":"2026-06-23 08:31:16.000000000","message":"ditto","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":931,"context_line":""},{"line_number":932,"context_line":"    # ------------------------------------------------------------------"},{"line_number":933,"context_line":"    # Conntrack flush tests"},{"line_number":934,"context_line":"    # ------------------------------------------------------------------"},{"line_number":935,"context_line":""},{"line_number":936,"context_line":"    def test_remove_conntrack_new_firewall(self):"},{"line_number":937,"context_line":"        apply_list \u003d self._fake_apply_list()"}],"source_content_type":"text/x-python","patch_set":21,"id":"51dbaba8_54a75e29","line":934,"in_reply_to":"d4f24bb1_40ce05c1","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1004,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":1005,"context_line":"             \u0027action\u0027: \u0027reject\u0027,"},{"line_number":1006,"context_line":"             \u0027id\u0027: \u0027fake-fw-rule3\u0027}"},{"line_number":1007,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1008,"context_line":"        rules_inserted \u003d ["},{"line_number":1009,"context_line":"            {\u0027id\u0027: \u0027fake-fw-rule\u0027,"},{"line_number":1010,"context_line":"             \u0027protocol\u0027: \u0027icmp\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"974d29d3_db3b99d2","line":1007,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1004,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":1005,"context_line":"             \u0027action\u0027: \u0027reject\u0027,"},{"line_number":1006,"context_line":"             \u0027id\u0027: \u0027fake-fw-rule3\u0027}"},{"line_number":1007,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1008,"context_line":"        rules_inserted \u003d ["},{"line_number":1009,"context_line":"            {\u0027id\u0027: \u0027fake-fw-rule\u0027,"},{"line_number":1010,"context_line":"             \u0027protocol\u0027: \u0027icmp\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"1659b8ee_3f98a06b","line":1007,"in_reply_to":"974d29d3_db3b99d2","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1012,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":1013,"context_line":"             \u0027action\u0027: \u0027deny\u0027,"},{"line_number":1014,"context_line":"             \u0027position\u0027: \u00272\u0027}"},{"line_number":1015,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1016,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1017,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1018,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":21,"id":"aeb7d699_b9cae580","line":1015,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1012,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":1013,"context_line":"             \u0027action\u0027: \u0027deny\u0027,"},{"line_number":1014,"context_line":"             \u0027position\u0027: \u00272\u0027}"},{"line_number":1015,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1016,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1017,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1018,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":21,"id":"2377fcb9_f3ad7240","line":1015,"in_reply_to":"aeb7d699_b9cae580","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1016,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1017,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1018,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("},{"line_number":1019,"context_line":"                rules_changed + rules_inserted, namespace)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"    def test_remove_conntrack_removed_rule(self):"},{"line_number":1022,"context_line":"        apply_list \u003d self._fake_apply_list()"}],"source_content_type":"text/x-python","patch_set":21,"id":"2e4ea49a_0113f711","line":1019,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1016,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1017,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1018,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("},{"line_number":1019,"context_line":"                rules_changed + rules_inserted, namespace)"},{"line_number":1020,"context_line":""},{"line_number":1021,"context_line":"    def test_remove_conntrack_removed_rule(self):"},{"line_number":1022,"context_line":"        apply_list \u003d self._fake_apply_list()"}],"source_content_type":"text/x-python","patch_set":21,"id":"fb1cfa7c_a3de3e4a","line":1019,"in_reply_to":"2e4ea49a_0113f711","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1045,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":1046,"context_line":"             \u0027action\u0027: \u0027reject\u0027,"},{"line_number":1047,"context_line":"             \u0027id\u0027: \u0027fake-fw-rule3\u0027}"},{"line_number":1048,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1049,"context_line":"        rules_removed \u003d ["},{"line_number":1050,"context_line":"            {\u0027enabled\u0027: True,"},{"line_number":1051,"context_line":"             \u0027position\u0027: \u00271\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"9d8adc41_57b40104","line":1048,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1045,"context_line":"             \u0027enabled\u0027: True,"},{"line_number":1046,"context_line":"             \u0027action\u0027: \u0027reject\u0027,"},{"line_number":1047,"context_line":"             \u0027id\u0027: \u0027fake-fw-rule3\u0027}"},{"line_number":1048,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1049,"context_line":"        rules_removed \u003d ["},{"line_number":1050,"context_line":"            {\u0027enabled\u0027: True,"},{"line_number":1051,"context_line":"             \u0027position\u0027: \u00271\u0027,"}],"source_content_type":"text/x-python","patch_set":21,"id":"fc54c200_c5e1d924","line":1048,"in_reply_to":"9d8adc41_57b40104","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1054,"context_line":"             \u0027ip_version\u0027: 4,"},{"line_number":1055,"context_line":"             \u0027action\u0027: \u0027deny\u0027,"},{"line_number":1056,"context_line":"             \u0027destination_port\u0027: \u002722\u0027}"},{"line_number":1057,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1058,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1059,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1060,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":21,"id":"0edbc40a_e6ccc949","line":1057,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1054,"context_line":"             \u0027ip_version\u0027: 4,"},{"line_number":1055,"context_line":"             \u0027action\u0027: \u0027deny\u0027,"},{"line_number":1056,"context_line":"             \u0027destination_port\u0027: \u002722\u0027}"},{"line_number":1057,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1058,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1059,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1060,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":21,"id":"49ca1b95_2b6eb30d","line":1057,"in_reply_to":"0edbc40a_e6ccc949","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1058,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1059,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1060,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("},{"line_number":1061,"context_line":"                rules_changed + rules_removed, namespace)"},{"line_number":1062,"context_line":""},{"line_number":1063,"context_line":"    def test_remove_conntrack_changed_rule(self):"},{"line_number":1064,"context_line":"        apply_list \u003d self._fake_apply_list()"}],"source_content_type":"text/x-python","patch_set":21,"id":"c6b8855c_16579500","line":1061,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1058,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1059,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1060,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("},{"line_number":1061,"context_line":"                rules_changed + rules_removed, namespace)"},{"line_number":1062,"context_line":""},{"line_number":1063,"context_line":"    def test_remove_conntrack_changed_rule(self):"},{"line_number":1064,"context_line":"        apply_list \u003d self._fake_apply_list()"}],"source_content_type":"text/x-python","patch_set":21,"id":"e82e8bd3_b1d3fe3d","line":1061,"in_reply_to":"c6b8855c_16579500","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1089,"context_line":"             \u0027id\u0027: \u0027fake-fw-rule3\u0027,"},{"line_number":1090,"context_line":"             \u0027ip_version\u0027: 4,"},{"line_number":1091,"context_line":"             \u0027protocol\u0027: \u0027tcp\u0027}"},{"line_number":1092,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1093,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1094,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1095,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":21,"id":"58ad5231_53cadc48","line":1092,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1089,"context_line":"             \u0027id\u0027: \u0027fake-fw-rule3\u0027,"},{"line_number":1090,"context_line":"             \u0027ip_version\u0027: 4,"},{"line_number":1091,"context_line":"             \u0027protocol\u0027: \u0027tcp\u0027}"},{"line_number":1092,"context_line":"        ] * 2  # egress and ingress rule lists"},{"line_number":1093,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1094,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1095,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("}],"source_content_type":"text/x-python","patch_set":21,"id":"00f8bdbf_d905c327","line":1092,"in_reply_to":"58ad5231_53cadc48","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f93bd7645259f265e84703407c6158271790d0fa","unresolved":true,"context_lines":[{"line_number":1093,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1094,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1095,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("},{"line_number":1096,"context_line":"                rules_changed, namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"eae6a007_fe6f1780","line":1096,"updated":"2026-06-23 08:31:16.000000000","message":"nit: unrelated","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"4a63f03bfa531252a4787223b22089af852f4326","unresolved":false,"context_lines":[{"line_number":1093,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":1094,"context_line":"            namespace \u003d router_info_inst.iptables_manager.namespace"},{"line_number":1095,"context_line":"            self.firewall.conntrack.delete_entries.assert_called_once_with("},{"line_number":1096,"context_line":"                rules_changed, namespace)"}],"source_content_type":"text/x-python","patch_set":21,"id":"8757e575_1d51565d","line":1096,"in_reply_to":"eae6a007_fe6f1780","updated":"2026-07-21 06:56:24.000000000","message":"Acknowledged","commit_id":"2da41e638332a6916c4b9d45ce16cce04d716ff2"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9a65b0479ccf4c35955d79617e05d5576e5bfeed","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":237,"context_line":"            if (distributed"},{"line_number":238,"context_line":"                    and distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":239,"context_line":"                # -------------------------------------------------------"},{"line_number":240,"context_line":"                # DVR-SNAT: rules go on snat_iptables_manager."},{"line_number":241,"context_line":"                # _chain_exists returns False (chains list starts empty) so"}],"source_content_type":"text/x-python","patch_set":22,"id":"5e05265e_039a512c","line":238,"updated":"2026-07-21 07:40:03.000000000","message":"pep8: W503 line break before binary operator","commit_id":"3cc87348f44f236acbce630556f274a6d63c76ae"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9a65b0479ccf4c35955d79617e05d5576e5bfeed","unresolved":false,"context_lines":[{"line_number":288,"context_line":"                v4filter_inst.assert_has_calls(calls)"},{"line_number":289,"context_line":""},{"line_number":290,"context_line":"            elif (distributed"},{"line_number":291,"context_line":"                  and distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR):"},{"line_number":292,"context_line":"                # -------------------------------------------------------"},{"line_number":293,"context_line":"                # DVR (rfp- interface): direction is SWAPPED."},{"line_number":294,"context_line":"                # _apply_firewall_to_interface detects is_rfp\u003dTrue:"}],"source_content_type":"text/x-python","patch_set":22,"id":"edf78ffd_f1b0bf2f","line":291,"updated":"2026-07-21 07:40:03.000000000","message":"pep8: W503 line break before binary operator","commit_id":"3cc87348f44f236acbce630556f274a6d63c76ae"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9a65b0479ccf4c35955d79617e05d5576e5bfeed","unresolved":false,"context_lines":[{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":432,"context_line":"            if (distributed"},{"line_number":433,"context_line":"                    and distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":434,"context_line":"                # v6 rules go on the snat manager\u0027s v6 filter."},{"line_number":435,"context_line":"                # _fake_rules_v6 only populates chains on the main manager,"},{"line_number":436,"context_line":"                # so snat v6filter chains remain [] -\u003e fw-chain FORWARD jumps"}],"source_content_type":"text/x-python","patch_set":22,"id":"893e387f_c634df5e","line":433,"updated":"2026-07-21 07:40:03.000000000","message":"pep8: W503 line break before binary operator","commit_id":"3cc87348f44f236acbce630556f274a6d63c76ae"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"9a65b0479ccf4c35955d79617e05d5576e5bfeed","unresolved":false,"context_lines":[{"line_number":467,"context_line":"                v6filter_inst.assert_has_calls(calls)"},{"line_number":468,"context_line":""},{"line_number":469,"context_line":"            elif (distributed"},{"line_number":470,"context_line":"                  and distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR):"},{"line_number":471,"context_line":"                # DVR rfp- interface: directions are swapped for fw chains."},{"line_number":472,"context_line":"                # INGRESS -\u003e -i, EGRESS -\u003e -o"},{"line_number":473,"context_line":"                # Default chain jumps: always -o then -i (unchanged)."}],"source_content_type":"text/x-python","patch_set":22,"id":"459dd8c0_5363dc1e","line":470,"updated":"2026-07-21 07:40:03.000000000","message":"pep8: W503 line break before binary operator","commit_id":"3cc87348f44f236acbce630556f274a6d63c76ae"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1b68332869fc954b8d0a555ebc870a33b35fc9d7","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":237,"context_line":"            if (distributed and"},{"line_number":238,"context_line":"                distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":239,"context_line":"                # -------------------------------------------------------"},{"line_number":240,"context_line":"                # DVR-SNAT: rules go on snat_iptables_manager."},{"line_number":241,"context_line":"                # _chain_exists returns False (chains list starts empty) so"}],"source_content_type":"text/x-python","patch_set":23,"id":"d1ef7187_935af493","line":238,"updated":"2026-07-21 08:55:57.000000000","message":"pep8: E129 visually indented line with same indent as next logical line","commit_id":"ca45416f7224816250843f96f1d6a8f255bbea91"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"1b68332869fc954b8d0a555ebc870a33b35fc9d7","unresolved":false,"context_lines":[{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":432,"context_line":"            if (distributed and"},{"line_number":433,"context_line":"                distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":434,"context_line":"                # v6 rules go on the snat manager\u0027s v6 filter."},{"line_number":435,"context_line":"                # _fake_rules_v6 only populates chains on the main manager,"},{"line_number":436,"context_line":"                # so snat v6filter chains remain [] -\u003e fw-chain FORWARD jumps"}],"source_content_type":"text/x-python","patch_set":23,"id":"6bb50216_fe9c3496","line":433,"updated":"2026-07-21 08:55:57.000000000","message":"pep8: E129 visually indented line with same indent as next logical line","commit_id":"ca45416f7224816250843f96f1d6a8f255bbea91"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"8deca6b146a4e9f41b682a55bbbc36b6a38b1d9b","unresolved":false,"context_lines":[{"line_number":235,"context_line":""},{"line_number":236,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":237,"context_line":"            if (distributed and"},{"line_number":238,"context_line":"                  distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":239,"context_line":"                # -------------------------------------------------------"},{"line_number":240,"context_line":"                # DVR-SNAT: rules go on snat_iptables_manager."},{"line_number":241,"context_line":"                # _chain_exists returns False (chains list starts empty) so"}],"source_content_type":"text/x-python","patch_set":24,"id":"c179fc7b_28c71969","line":238,"updated":"2026-07-21 09:58:53.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"ca2b9958fcf9aac31bfc20106b23ee48a4babe49"},{"author":{"_account_id":22348,"name":"Zuul","username":"zuul","tags":["SERVICE_USER"]},"tag":"autogenerated:zuul:check","change_message_id":"8deca6b146a4e9f41b682a55bbbc36b6a38b1d9b","unresolved":false,"context_lines":[{"line_number":430,"context_line":""},{"line_number":431,"context_line":"        for router_info_inst, port_ids in apply_list:"},{"line_number":432,"context_line":"            if (distributed and"},{"line_number":433,"context_line":"                  distributed_mode \u003d\u003d constants.L3_AGENT_MODE_DVR_SNAT):"},{"line_number":434,"context_line":"                # v6 rules go on the snat manager\u0027s v6 filter."},{"line_number":435,"context_line":"                # _fake_rules_v6 only populates chains on the main manager,"},{"line_number":436,"context_line":"                # so snat v6filter chains remain [] -\u003e fw-chain FORWARD jumps"}],"source_content_type":"text/x-python","patch_set":24,"id":"dbca6222_794f4a57","line":433,"updated":"2026-07-21 09:58:53.000000000","message":"pep8: E127 continuation line over-indented for visual indent","commit_id":"ca2b9958fcf9aac31bfc20106b23ee48a4babe49"}],"playbooks/enable_fwaas_subnode.yaml":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f33bcbc7247593622a39734200087841bffe5123","unresolved":true,"context_lines":[{"line_number":5,"context_line":"        path: /opt/stack/devstack/local.conf"},{"line_number":6,"context_line":"        line: \"enable_plugin neutron-fwaas https://opendev.org/openstack/neutron-fwaas.git\""},{"line_number":7,"context_line":"        insertbefore: \u0027^\\[localrc\\]\u0027"},{"line_number":8,"context_line":"        create: yes"}],"source_content_type":"text/x-yaml","patch_set":38,"id":"b6e9f804_972af508","line":8,"updated":"2026-09-01 13:26:24.000000000","message":"why do we need such ansible playbook at all?","commit_id":"940d5600c830803f06cc4c2a1c2e5fab65df812e"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"77aaa197c92cc0a2c57763666565b8fa98cea24f","unresolved":false,"context_lines":[{"line_number":5,"context_line":"        path: /opt/stack/devstack/local.conf"},{"line_number":6,"context_line":"        line: \"enable_plugin neutron-fwaas https://opendev.org/openstack/neutron-fwaas.git\""},{"line_number":7,"context_line":"        insertbefore: \u0027^\\[localrc\\]\u0027"},{"line_number":8,"context_line":"        create: yes"}],"source_content_type":"text/x-yaml","patch_set":38,"id":"6211349b_a1978dc5","line":8,"in_reply_to":"77c5d523_42c740aa","updated":"2026-09-05 09:57:12.000000000","message":"Acknowledged","commit_id":"940d5600c830803f06cc4c2a1c2e5fab65df812e"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"bcece6f89cbc412d10ddf06fcdad6d3bb641ecd1","unresolved":true,"context_lines":[{"line_number":5,"context_line":"        path: /opt/stack/devstack/local.conf"},{"line_number":6,"context_line":"        line: \"enable_plugin neutron-fwaas https://opendev.org/openstack/neutron-fwaas.git\""},{"line_number":7,"context_line":"        insertbefore: \u0027^\\[localrc\\]\u0027"},{"line_number":8,"context_line":"        create: yes"}],"source_content_type":"text/x-yaml","patch_set":38,"id":"77c5d523_42c740aa","line":8,"in_reply_to":"b6e9f804_972af508","updated":"2026-09-05 09:41:41.000000000","message":"As Alonso said, and according to the compute logs, the fwaas plugin is not loaded at all:\nWARNING stevedore.named [-] Could not load fwaas_v2\nINFO neutron.agent.agent_extensions_manager [-] Loaded agent extensions: []\nSo I tried to make sure it is loaded properly using this playbook.\nAfter I used this playbook, the above log disappeared. This means it is loaded properly now.","commit_id":"940d5600c830803f06cc4c2a1c2e5fab65df812e"}],"playbooks/fix_neutron_permissions.yaml":[{"author":{"_account_id":11975,"name":"Slawek Kaplonski","email":"skaplons@redhat.com","username":"slaweq"},"change_message_id":"f33bcbc7247593622a39734200087841bffe5123","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":38,"id":"c96ef10e_180b8e58","line":11,"updated":"2026-09-01 13:26:24.000000000","message":"why this is needed at all?","commit_id":"940d5600c830803f06cc4c2a1c2e5fab65df812e"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"77aaa197c92cc0a2c57763666565b8fa98cea24f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":38,"id":"e337005d_9be73510","line":11,"in_reply_to":"a26214ba_a1012484","updated":"2026-09-05 09:57:12.000000000","message":"Acknowledged","commit_id":"940d5600c830803f06cc4c2a1c2e5fab65df812e"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"bcece6f89cbc412d10ddf06fcdad6d3bb641ecd1","unresolved":true,"context_lines":[],"source_content_type":"","patch_set":38,"id":"a26214ba_a1012484","line":11,"in_reply_to":"c96ef10e_180b8e58","updated":"2026-09-05 09:41:41.000000000","message":"I used the mentioned playbook to fix the permission error that I get each time the `neutron-fwaas-v2-dsvm-tempest-multinode-dvr` job runs. The exact error is:\n\ncontroller/logs/screen-q-l3.txt:1148:Aug 31 08:48:36.227872 npb652e25333104 neutron-l3-agent[61388]: ERROR neutron.agent.l3.ha_router [-] Error while writing HA state for b2c86e0e-b9c3-4ce8-aed2-0d8e009882e1: [Errno 13] Permission denied: \u0027/opt/stack/data/neutron/ha_confs/b2c86e0e-b9c3-4ce8-aed2-0d8e009882e1/state\u0027: PermissionError: [Errno 13] Permission denied: \u0027/opt/stack/data/neutron/ha_confs/b2c86e0e-b9c3-4ce8-aed2-0d8e009882e1/state\u0027\n\nI have no idea what the root cause of this error is. \nDo you have any idea why I should get this error?\nI appreciate your help in advance.","commit_id":"940d5600c830803f06cc4c2a1c2e5fab65df812e"}],"releasenotes/notes/fwaas-dvr-support-1286eb358b456479.yaml":[{"author":{"_account_id":16688,"name":"Rodolfo Alonso","email":"ralonsoh@redhat.com","username":"rodolfo-alonso-hernandez"},"change_message_id":"8a4ee3a4f7206ee68b4ff1e1ae0c9c9bf00d489f","unresolved":true,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The iptables Firewall-as-a-Service v2 driver"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"67d4036c_9d820d20","line":1,"updated":"2026-08-24 13:18:55.000000000","message":"This is a release note, not a documentation text. This should be concise on the feature added. Most of this text should be added in the documentation section.","commit_id":"69ec06fe9ce4a55655aeee449f297fea2fb0b764"},{"author":{"_account_id":37835,"name":"Mohsen Sepandar","display_name":"Mohsen","email":"msepandar32@gmail.com","username":"mohsensepandar"},"change_message_id":"75cd61e147fe9e11130df3e939bc4bd6ac82ab1e","unresolved":false,"context_lines":[{"line_number":1,"context_line":"---"},{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    The iptables Firewall-as-a-Service v2 driver"}],"source_content_type":"text/x-yaml","patch_set":31,"id":"7ba55cf0_bfe863ec","line":1,"in_reply_to":"67d4036c_9d820d20","updated":"2026-08-26 05:13:15.000000000","message":"Acknowledged","commit_id":"69ec06fe9ce4a55655aeee449f297fea2fb0b764"}]}
