)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4581e8b06f3f9eac7abc90277eb96741bd10fc96","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"6c7479c0_9b03ba0b","updated":"2024-05-15 08:49:20.000000000","message":"Another helper process is going to introduced to L3 router. Hardly to say if there is a balance between the resource-consuming and zero loss for connections. New processing will augment the failure point for router processing.","commit_id":"7f9d7189f13d4ddb8ce8688b6fcf0dedc5567130"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"ccf7a589fffde6110f270f03364cdb3f30d784f8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"da23d726_4cb7e1b7","updated":"2024-05-13 08:15:18.000000000","message":"recheck","commit_id":"7f9d7189f13d4ddb8ce8688b6fcf0dedc5567130"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"ed9172b65fe1fe2d3af1bfe9b1abd247c73e27a1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"91bcd1dc_68768b2a","updated":"2024-05-23 21:00:23.000000000","message":"recheck","commit_id":"1d7d0b9b08f35cb2c68e4233e617b465da6ccbd5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"2487f4cf7e9ea85c38b1c16534fb15221ce78790","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":6,"id":"06ee80d4_fc95a110","updated":"2024-05-30 10:40:36.000000000","message":"recheck","commit_id":"f1028bf768409a9e70da9d43aa8232d498da4511"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"2bf0dde93b95e508f09389eb2c1af454be9f35c4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":7,"id":"d7a90f1a_53669fa1","updated":"2024-06-06 13:27:28.000000000","message":"recheck","commit_id":"f0d1461aa2ed1f39c79b6e2bfff4b9a0933b7d9f"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7f2421f2cd74c1bfe6752501a01ef70004e62d20","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"8cc8edce_09931288","updated":"2024-11-14 23:11:34.000000000","message":"Thanks for your review.","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"0ef3637ad9e4f9c6f6be793ad92df9ba25dfa11c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"49ffa857_dc8c5084","updated":"2024-06-19 08:09:54.000000000","message":"recheck","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"06dd530a1149cad08b1d52f81b6926e645326587","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"902daaec_18f7377d","updated":"2024-06-20 13:28:46.000000000","message":"recheck","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"212de72136258100ecbcaf3df2b716577b23a922","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"288784f1_954325c0","updated":"2024-09-09 06:50:13.000000000","message":"recheck restored","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"b39dd454a16d05d6fca83686680d1d3db775b8e8","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"29d0b017_1414b377","updated":"2024-06-26 21:08:07.000000000","message":"recheck unrelated test failures","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8ca8984a_e1cf2baf","updated":"2025-01-09 13:22:41.000000000","message":"Because this change got merged before I had a change to submit this, these fixes are now submitted separately in https://review.opendev.org/c/openstack/neutron/+/938800","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"352cd345_d6bdd838","updated":"2024-12-19 00:27:24.000000000","message":"I have a question about inclusion of a GPL script into Python code that is under Apache license. Is it not a GPL violation?","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"956068e3697cdfc20c995fe378de790148a1766f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"19d2655a_37f843a5","updated":"2024-12-24 02:12:26.000000000","message":"Looks good, let\u0027s move on.","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"b7d89f04f17cddb88e6d31a9ef4674c17045a0f2","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"8fd36683_ea6d326f","updated":"2024-11-19 08:19:34.000000000","message":"recheck new os-ken release","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4997010166a4690ae3b64e61cc24aba2d97ade4a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"f52bc969_6a403824","updated":"2024-12-06 13:32:03.000000000","message":"very nice :-)","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"}],"neutron/agent/linux/conntrackd.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2fc0587e7ab41e07d327ccb57292156362ec6eb0","unresolved":true,"context_lines":[{"line_number":78,"context_line":"\"\"\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"HA_SCRIPT_TEMPLATE \u003d jinja2.Template("},{"line_number":81,"context_line":"    \"\"\"#!/bin/sh"},{"line_number":82,"context_line":"#"},{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":8,"id":"cb748e25_dca2a1dc","line":81,"updated":"2024-11-12 23:01:30.000000000","message":"Should this be:\n\n#!/usr/bin/env bash","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7f2421f2cd74c1bfe6752501a01ef70004e62d20","unresolved":false,"context_lines":[{"line_number":78,"context_line":"\"\"\")"},{"line_number":79,"context_line":""},{"line_number":80,"context_line":"HA_SCRIPT_TEMPLATE \u003d jinja2.Template("},{"line_number":81,"context_line":"    \"\"\"#!/bin/sh"},{"line_number":82,"context_line":"#"},{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":8,"id":"a7704146_134a7dbb","line":81,"in_reply_to":"cb748e25_dca2a1dc","updated":"2024-11-14 23:11:34.000000000","message":"According to \"checkbashisms\" this script does not contain any BASH specific code. I changed it to \"#!/usr/bin/env sh\".","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2fc0587e7ab41e07d327ccb57292156362ec6eb0","unresolved":true,"context_lines":[{"line_number":279,"context_line":"        pid_file \u003d self.get_pid_file_path()"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        cmd \u003d \u0027conntrackd -d -C %s\u0027 % config_path"},{"line_number":282,"context_line":"        pids \u003d utils.find_pids_by_cmd(cmd)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        if pids:"},{"line_number":285,"context_line":"            pid \u003d pids[0]"}],"source_content_type":"text/x-python","patch_set":8,"id":"7f732d97_13b0b091","line":282,"updated":"2024-11-12 23:01:30.000000000","message":"Is \u0027config_path\u0027 unique enough so this only returns processes started by neutron and not any conntrackds running on the system?","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7f2421f2cd74c1bfe6752501a01ef70004e62d20","unresolved":false,"context_lines":[{"line_number":279,"context_line":"        pid_file \u003d self.get_pid_file_path()"},{"line_number":280,"context_line":""},{"line_number":281,"context_line":"        cmd \u003d \u0027conntrackd -d -C %s\u0027 % config_path"},{"line_number":282,"context_line":"        pids \u003d utils.find_pids_by_cmd(cmd)"},{"line_number":283,"context_line":""},{"line_number":284,"context_line":"        if pids:"},{"line_number":285,"context_line":"            pid \u003d pids[0]"}],"source_content_type":"text/x-python","patch_set":8,"id":"74a7a3a8_d0d4812c","line":282,"in_reply_to":"7f732d97_13b0b091","updated":"2024-11-14 23:11:34.000000000","message":"As it contains the router\u0027s UUID it should be unique enough to match only the conntrackd instance for this router.","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2fc0587e7ab41e07d327ccb57292156362ec6eb0","unresolved":true,"context_lines":[{"line_number":303,"context_line":"            utils.delete_if_exists(self.get_ctlfile_path(), run_as_root\u003dTrue)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        def post_cmd_callback():"},{"line_number":306,"context_line":"            self.create_pid_file()"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            # Synchronize connection tracking state with peer"},{"line_number":309,"context_line":"            cmd \u003d [\u0027conntrackd\u0027, \u0027-C\u0027, config_path, \u0027-n\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"5080c2c0_4a25506c","line":306,"updated":"2024-11-12 23:01:30.000000000","message":"Why is this done here and below after pm.enable() ?","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7f2421f2cd74c1bfe6752501a01ef70004e62d20","unresolved":false,"context_lines":[{"line_number":303,"context_line":"            utils.delete_if_exists(self.get_ctlfile_path(), run_as_root\u003dTrue)"},{"line_number":304,"context_line":""},{"line_number":305,"context_line":"        def post_cmd_callback():"},{"line_number":306,"context_line":"            self.create_pid_file()"},{"line_number":307,"context_line":""},{"line_number":308,"context_line":"            # Synchronize connection tracking state with peer"},{"line_number":309,"context_line":"            cmd \u003d [\u0027conntrackd\u0027, \u0027-C\u0027, config_path, \u0027-n\u0027]"}],"source_content_type":"text/x-python","patch_set":8,"id":"e916222b_d3c32066","line":306,"in_reply_to":"5080c2c0_4a25506c","updated":"2024-11-14 23:11:34.000000000","message":"Good catch, the invocation after pm.enable() is not needed. Removed.","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"},{"line_number":85,"context_line":"# This program is free software; you can redistribute it and/or modify"},{"line_number":86,"context_line":"# it under the terms of the GNU General Public License as published by"},{"line_number":87,"context_line":"# the Free Software Foundation; either version 2 of the License, or"},{"line_number":88,"context_line":"# (at your option) any later version."},{"line_number":89,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":10,"id":"009f9f98_40027b0c","line":86,"updated":"2024-12-19 00:27:24.000000000","message":"Hm. Doesn\u0027t inclusion of GPL code effectively make neutron code base GPL too?","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"65c7ebfec7abfc46151bfc82f2ac12fb104c74ef","unresolved":true,"context_lines":[{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"},{"line_number":85,"context_line":"# This program is free software; you can redistribute it and/or modify"},{"line_number":86,"context_line":"# it under the terms of the GNU General Public License as published by"},{"line_number":87,"context_line":"# the Free Software Foundation; either version 2 of the License, or"},{"line_number":88,"context_line":"# (at your option) any later version."},{"line_number":89,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":10,"id":"d7bdc8b8_1b803cb4","line":86,"in_reply_to":"009f9f98_40027b0c","updated":"2024-12-19 00:40:45.000000000","message":"For context, that\u0027s what my ChatGPT lawyer has to say on this:\n\n```\nIf you\u0027re embedding a GPL-licensed script directly into your Python code (e.g., as a string or a multi-line variable), then the GPL license applies to that specific portion of the code, even though it\u0027s just a template. This means that the template would need to comply with the requirements of the GPL, including making the license text available and ensuring that modifications to the template (if any) are also licensed under the GPL.\n\nGPL\u0027s \"Copyleft\" Nature: The GPL has a \"copyleft\" provision, which means that if you include GPL-licensed code (even just a template) in a project, the entire project might need to be licensed under the GPL if the GPL code is considered a part of the overall program. In your case, this could mean that the entire Python script would need to be licensed under the GPL because the template is embedded directly within it.\n\n[...]\n\n4. Possible Solutions:\n\nThere are a few ways you might address this issue, depending on your desired outcome:\n\n    Keep the Template Separate: Instead of embedding the template directly in the Python code, you could store it as a separate file (e.g., a .tpl file) and have the Python code read the file at runtime. This way, the GPL license applies only to the template file, and your Python code can remain under the Apache 2.0 license, as long as there\u0027s no direct \"linking\" between the Python code and the GPL code.\n\n    Dual Licensing: If the embedded GPL template is critical to the Python code, you might need to dual-license your entire Python codebase under both Apache 2.0 and GPL. This would give users the option to choose which license they want to comply with, but it’s a more complex solution and requires careful documentation.\n\n    Rewriting the Template: If the template is relatively simple, another option would be to rewrite it in a way that doesn’t require a GPL license. This would allow you to avoid the issue entirely, keeping your Python code under the Apache 2.0 license without any complications.\n```\n\nI think to stay on safe side, we may want to keep the template in a separate file and read it at runtime, (the first option above). What do you think?","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"b65c5e9bc2184a380a60808158e06fb4141fad94","unresolved":false,"context_lines":[{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"},{"line_number":85,"context_line":"# This program is free software; you can redistribute it and/or modify"},{"line_number":86,"context_line":"# it under the terms of the GNU General Public License as published by"},{"line_number":87,"context_line":"# the Free Software Foundation; either version 2 of the License, or"},{"line_number":88,"context_line":"# (at your option) any later version."},{"line_number":89,"context_line":"#"}],"source_content_type":"text/x-python","patch_set":10,"id":"3b135a39_c5509f0a","line":86,"in_reply_to":"d7bdc8b8_1b803cb4","updated":"2025-01-09 13:23:22.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4997010166a4690ae3b64e61cc24aba2d97ade4a","unresolved":true,"context_lines":[{"line_number":80,"context_line":"HA_SCRIPT_TEMPLATE \u003d jinja2.Template("},{"line_number":81,"context_line":"    \"\"\"#!/usr/bin/env sh"},{"line_number":82,"context_line":"#"},{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"},{"line_number":85,"context_line":"# This program is free software; you can redistribute it and/or modify"},{"line_number":86,"context_line":"# it under the terms of the GNU General Public License as published by"},{"line_number":87,"context_line":"# the Free Software Foundation; either version 2 of the License, or"},{"line_number":88,"context_line":"# (at your option) any later version."},{"line_number":89,"context_line":"#"},{"line_number":90,"context_line":"# Description:"},{"line_number":91,"context_line":"#"},{"line_number":92,"context_line":"# This is the script for primary-backup setups for keepalived"},{"line_number":93,"context_line":"# (http://www.keepalived.org). You may adapt it to make it work with other"},{"line_number":94,"context_line":"# high-availability managers."},{"line_number":95,"context_line":"#"},{"line_number":96,"context_line":"# Do not forget to include the required modifications to your keepalived.conf"},{"line_number":97,"context_line":"# file to invoke this script during keepalived\u0027s state transitions."},{"line_number":98,"context_line":"#"},{"line_number":99,"context_line":"# Contributions to improve this script are welcome :)."},{"line_number":100,"context_line":"#"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"CONNTRACKD_BIN\u003d/usr/sbin/conntrackd"}],"source_content_type":"text/x-python","patch_set":10,"id":"398c1252_4eb12b3a","line":99,"range":{"start_line":83,"start_character":6,"end_line":99,"end_character":54},"updated":"2024-12-06 13:32:03.000000000","message":"nit: is this part necessary in the template?","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"b72039fea94a3a3be6fc8a7fc4d0e153ff6ca66b","unresolved":true,"context_lines":[{"line_number":80,"context_line":"HA_SCRIPT_TEMPLATE \u003d jinja2.Template("},{"line_number":81,"context_line":"    \"\"\"#!/usr/bin/env sh"},{"line_number":82,"context_line":"#"},{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"},{"line_number":85,"context_line":"# This program is free software; you can redistribute it and/or modify"},{"line_number":86,"context_line":"# it under the terms of the GNU General Public License as published by"},{"line_number":87,"context_line":"# the Free Software Foundation; either version 2 of the License, or"},{"line_number":88,"context_line":"# (at your option) any later version."},{"line_number":89,"context_line":"#"},{"line_number":90,"context_line":"# Description:"},{"line_number":91,"context_line":"#"},{"line_number":92,"context_line":"# This is the script for primary-backup setups for keepalived"},{"line_number":93,"context_line":"# (http://www.keepalived.org). You may adapt it to make it work with other"},{"line_number":94,"context_line":"# high-availability managers."},{"line_number":95,"context_line":"#"},{"line_number":96,"context_line":"# Do not forget to include the required modifications to your keepalived.conf"},{"line_number":97,"context_line":"# file to invoke this script during keepalived\u0027s state transitions."},{"line_number":98,"context_line":"#"},{"line_number":99,"context_line":"# Contributions to improve this script are welcome :)."},{"line_number":100,"context_line":"#"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"CONNTRACKD_BIN\u003d/usr/sbin/conntrackd"}],"source_content_type":"text/x-python","patch_set":10,"id":"645098db_261a9556","line":99,"range":{"start_line":83,"start_character":6,"end_line":99,"end_character":54},"in_reply_to":"398c1252_4eb12b3a","updated":"2024-12-12 23:40:33.000000000","message":"I\u0027m not sure if it\u0027s really needed, but it was already there in the initial change from QthCN which this is based on and I\u0027m a bit reluctant to remove copyright notices from code copied from somewhere else. If you don\u0027t insist in removing it, I would prefer to leave it as is.","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"b65c5e9bc2184a380a60808158e06fb4141fad94","unresolved":false,"context_lines":[{"line_number":80,"context_line":"HA_SCRIPT_TEMPLATE \u003d jinja2.Template("},{"line_number":81,"context_line":"    \"\"\"#!/usr/bin/env sh"},{"line_number":82,"context_line":"#"},{"line_number":83,"context_line":"# (C) 2006-2011 by Pablo Neira Ayuso \u003cpablo@netfilter.org\u003e"},{"line_number":84,"context_line":"#"},{"line_number":85,"context_line":"# This program is free software; you can redistribute it and/or modify"},{"line_number":86,"context_line":"# it under the terms of the GNU General Public License as published by"},{"line_number":87,"context_line":"# the Free Software Foundation; either version 2 of the License, or"},{"line_number":88,"context_line":"# (at your option) any later version."},{"line_number":89,"context_line":"#"},{"line_number":90,"context_line":"# Description:"},{"line_number":91,"context_line":"#"},{"line_number":92,"context_line":"# This is the script for primary-backup setups for keepalived"},{"line_number":93,"context_line":"# (http://www.keepalived.org). You may adapt it to make it work with other"},{"line_number":94,"context_line":"# high-availability managers."},{"line_number":95,"context_line":"#"},{"line_number":96,"context_line":"# Do not forget to include the required modifications to your keepalived.conf"},{"line_number":97,"context_line":"# file to invoke this script during keepalived\u0027s state transitions."},{"line_number":98,"context_line":"#"},{"line_number":99,"context_line":"# Contributions to improve this script are welcome :)."},{"line_number":100,"context_line":"#"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"CONNTRACKD_BIN\u003d/usr/sbin/conntrackd"}],"source_content_type":"text/x-python","patch_set":10,"id":"74873d03_eaac24f5","line":99,"range":{"start_line":83,"start_character":6,"end_line":99,"end_character":54},"in_reply_to":"645098db_261a9556","updated":"2025-01-09 13:23:22.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"1bbc335f86501d51de8d3a4d338d6a41aa299639","unresolved":true,"context_lines":[{"line_number":99,"context_line":"# Contributions to improve this script are welcome :)."},{"line_number":100,"context_line":"#"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"CONNTRACKD_BIN\u003d/usr/sbin/conntrackd"},{"line_number":103,"context_line":"CONNTRACKD_LOCK\u003d{{ lock }}"},{"line_number":104,"context_line":"CONNTRACKD_CONFIG\u003d{{ config }}"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"93897332_25155aad","line":102,"updated":"2024-12-19 00:43:54.000000000","message":"(No action required) The assumption that the binary is located under a particular path may break in some unconventional environments like `NixOS`. We probably don\u0027t care much, though we probably could get away without an absolute path - allowing the shell to find the binary in `PATH`.","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"b65c5e9bc2184a380a60808158e06fb4141fad94","unresolved":false,"context_lines":[{"line_number":99,"context_line":"# Contributions to improve this script are welcome :)."},{"line_number":100,"context_line":"#"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"CONNTRACKD_BIN\u003d/usr/sbin/conntrackd"},{"line_number":103,"context_line":"CONNTRACKD_LOCK\u003d{{ lock }}"},{"line_number":104,"context_line":"CONNTRACKD_CONFIG\u003d{{ config }}"},{"line_number":105,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"c27b7586_1443b5af","line":102,"in_reply_to":"93897332_25155aad","updated":"2025-01-09 13:23:22.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":236,"context_line":"        os.chmod(ha_script_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def get_full_config_file_path(self, filename, maxlen\u003d255):"},{"line_number":239,"context_line":"        # Maximum PATH lenght for most paths in conntrackd is limited to"},{"line_number":240,"context_line":"        # 255 characters."},{"line_number":241,"context_line":"        conf_dir \u003d self.get_conf_dir()"},{"line_number":242,"context_line":"        ensure_tree(conf_dir, 0o755)"}],"source_content_type":"text/x-python","patch_set":10,"id":"cf2e80c4_427e363b","line":239,"updated":"2024-12-19 00:27:24.000000000","message":"nit: length","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":236,"context_line":"        os.chmod(ha_script_path, stat.S_IRUSR | stat.S_IWUSR | stat.S_IXUSR)"},{"line_number":237,"context_line":""},{"line_number":238,"context_line":"    def get_full_config_file_path(self, filename, maxlen\u003d255):"},{"line_number":239,"context_line":"        # Maximum PATH lenght for most paths in conntrackd is limited to"},{"line_number":240,"context_line":"        # 255 characters."},{"line_number":241,"context_line":"        conf_dir \u003d self.get_conf_dir()"},{"line_number":242,"context_line":"        ensure_tree(conf_dir, 0o755)"}],"source_content_type":"text/x-python","patch_set":10,"id":"f8952ee1_cee35a2b","line":239,"in_reply_to":"cf2e80c4_427e363b","updated":"2025-01-09 13:22:41.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":254,"context_line":"        confs_dir \u003d os.path.abspath("},{"line_number":255,"context_line":"            os.path.normpath(self.agent_conf.ha_confs_path))"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        conf_dir \u003d os.path.join(confs_dir, self.resource_id)"},{"line_number":258,"context_line":"        return conf_dir"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def get_ha_script_path(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"cfb646d3_30c3337a","line":257,"updated":"2024-12-19 00:27:24.000000000","message":"nit: just return, no need for a variable","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":254,"context_line":"        confs_dir \u003d os.path.abspath("},{"line_number":255,"context_line":"            os.path.normpath(self.agent_conf.ha_confs_path))"},{"line_number":256,"context_line":""},{"line_number":257,"context_line":"        conf_dir \u003d os.path.join(confs_dir, self.resource_id)"},{"line_number":258,"context_line":"        return conf_dir"},{"line_number":259,"context_line":""},{"line_number":260,"context_line":"    def get_ha_script_path(self):"}],"source_content_type":"text/x-python","patch_set":10,"id":"1732b74d_4a895514","line":257,"in_reply_to":"cfb646d3_30c3337a","updated":"2025-01-09 13:22:41.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":269,"context_line":"    def get_ctlfile_path(self):"},{"line_number":270,"context_line":"        # Unix socket path length is limited to 107 characters in the"},{"line_number":271,"context_line":"        # conntrackd source code. See UNIX_PATH_MAX constant in include/local.h"},{"line_number":272,"context_line":"        return self.get_full_config_file_path(\u0027conntrackd.ctl\u0027, maxlen\u003d107)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def get_conffile_path(self):"},{"line_number":275,"context_line":"        return self.get_full_config_file_path(\u0027conntrackd.conf\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"68503bca_c551d47c","line":272,"updated":"2024-12-19 00:27:24.000000000","message":"please introduce a constant at the start of the module and use it here. (name it UNIX_PATH_MAX)","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":269,"context_line":"    def get_ctlfile_path(self):"},{"line_number":270,"context_line":"        # Unix socket path length is limited to 107 characters in the"},{"line_number":271,"context_line":"        # conntrackd source code. See UNIX_PATH_MAX constant in include/local.h"},{"line_number":272,"context_line":"        return self.get_full_config_file_path(\u0027conntrackd.ctl\u0027, maxlen\u003d107)"},{"line_number":273,"context_line":""},{"line_number":274,"context_line":"    def get_conffile_path(self):"},{"line_number":275,"context_line":"        return self.get_full_config_file_path(\u0027conntrackd.conf\u0027)"}],"source_content_type":"text/x-python","patch_set":10,"id":"eb021a79_a08fc6be","line":272,"in_reply_to":"68503bca_c551d47c","updated":"2025-01-09 13:22:41.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":335,"context_line":"        if not pm.active:"},{"line_number":336,"context_line":"            return"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        # First try to stop conntrackd by using it\u0027s own control command"},{"line_number":339,"context_line":"        config_path \u003d self.get_conffile_path()"},{"line_number":340,"context_line":"        cmd \u003d [\u0027conntrackd\u0027, \u0027-C\u0027, config_path, \u0027-k\u0027]"},{"line_number":341,"context_line":"        utils.execute(cmd, run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"5f274f74_98fca9a6","line":338,"updated":"2024-12-19 00:27:24.000000000","message":"nit: it\u0027s-\u003eits","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":335,"context_line":"        if not pm.active:"},{"line_number":336,"context_line":"            return"},{"line_number":337,"context_line":""},{"line_number":338,"context_line":"        # First try to stop conntrackd by using it\u0027s own control command"},{"line_number":339,"context_line":"        config_path \u003d self.get_conffile_path()"},{"line_number":340,"context_line":"        cmd \u003d [\u0027conntrackd\u0027, \u0027-C\u0027, config_path, \u0027-k\u0027]"},{"line_number":341,"context_line":"        utils.execute(cmd, run_as_root\u003dTrue)"}],"source_content_type":"text/x-python","patch_set":10,"id":"94322793_d3017937","line":338,"in_reply_to":"5f274f74_98fca9a6","updated":"2025-01-09 13:22:41.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"}],"neutron/agent/linux/external_process.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4581e8b06f3f9eac7abc90277eb96741bd10fc96","unresolved":true,"context_lines":[{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    def __init__(self, conf, uuid, namespace\u003dNone, service\u003dNone,"},{"line_number":58,"context_line":"                 pids_path\u003dNone, default_cmd_callback\u003dNone,"},{"line_number":59,"context_line":"                 default_pre_cmd_callback\u003dNone, default_post_cmd_callback\u003dNone,"},{"line_number":60,"context_line":"                 cmd_addl_env\u003dNone, pid_file\u003dNone, run_as_root\u003dFalse,"},{"line_number":61,"context_line":"                 custom_reload_callback\u003dNone):"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1d0ec837_08a65f32","line":59,"range":{"start_line":59,"start_character":17,"end_line":59,"end_character":79},"updated":"2024-05-15 08:49:20.000000000","message":"New param should be added to the last, so the existing callers may not need to change the parmas order.","commit_id":"7f9d7189f13d4ddb8ce8688b6fcf0dedc5567130"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7a44683ec686325a7489810ae40753e29564c01c","unresolved":false,"context_lines":[{"line_number":56,"context_line":"    \"\"\""},{"line_number":57,"context_line":"    def __init__(self, conf, uuid, namespace\u003dNone, service\u003dNone,"},{"line_number":58,"context_line":"                 pids_path\u003dNone, default_cmd_callback\u003dNone,"},{"line_number":59,"context_line":"                 default_pre_cmd_callback\u003dNone, default_post_cmd_callback\u003dNone,"},{"line_number":60,"context_line":"                 cmd_addl_env\u003dNone, pid_file\u003dNone, run_as_root\u003dFalse,"},{"line_number":61,"context_line":"                 custom_reload_callback\u003dNone):"},{"line_number":62,"context_line":""}],"source_content_type":"text/x-python","patch_set":2,"id":"1faf49a3_415bfc54","line":59,"range":{"start_line":59,"start_character":17,"end_line":59,"end_character":79},"in_reply_to":"1d0ec837_08a65f32","updated":"2024-05-16 13:05:56.000000000","message":"Done","commit_id":"7f9d7189f13d4ddb8ce8688b6fcf0dedc5567130"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":67,"context_line":"        self.default_cmd_callback \u003d default_cmd_callback"},{"line_number":68,"context_line":"        self.default_pre_cmd_callback \u003d default_pre_cmd_callback"},{"line_number":69,"context_line":"        self.default_post_cmd_callback \u003d default_post_cmd_callback"},{"line_number":70,"context_line":"        self.cmd_addl_env \u003d cmd_addl_env"},{"line_number":71,"context_line":"        self.pids_path \u003d pids_path or self.conf.external_pids"},{"line_number":72,"context_line":"        self.pid_file \u003d pid_file"},{"line_number":73,"context_line":"        self.run_as_root \u003d run_as_root or self.namespace is not None"}],"source_content_type":"text/x-python","patch_set":10,"id":"ab5b7810_95c40881","line":70,"updated":"2024-12-19 00:27:24.000000000","message":"it\u0027s set in line 85, no?","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":67,"context_line":"        self.default_cmd_callback \u003d default_cmd_callback"},{"line_number":68,"context_line":"        self.default_pre_cmd_callback \u003d default_pre_cmd_callback"},{"line_number":69,"context_line":"        self.default_post_cmd_callback \u003d default_post_cmd_callback"},{"line_number":70,"context_line":"        self.cmd_addl_env \u003d cmd_addl_env"},{"line_number":71,"context_line":"        self.pids_path \u003d pids_path or self.conf.external_pids"},{"line_number":72,"context_line":"        self.pid_file \u003d pid_file"},{"line_number":73,"context_line":"        self.run_as_root \u003d run_as_root or self.namespace is not None"}],"source_content_type":"text/x-python","patch_set":10,"id":"e31a4aea_308f0604","line":70,"in_reply_to":"ab5b7810_95c40881","updated":"2025-01-09 13:22:41.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"}],"neutron/agent/linux/keepalived.py":[{"author":{"_account_id":9531,"name":"liuyulong","display_name":"LIU Yulong","email":"i@liuyulong.me","username":"LIU-Yulong"},"change_message_id":"4581e8b06f3f9eac7abc90277eb96741bd10fc96","unresolved":true,"context_lines":[{"line_number":185,"context_line":"    \"\"\"Instance section of a keepalived configuration.\"\"\""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def __init__(self, state, interface, vrouter_id, ha_cidrs,"},{"line_number":188,"context_line":"                 notify_script\u003dNone, priority\u003dHA_DEFAULT_PRIORITY,"},{"line_number":189,"context_line":"                 advert_int\u003dNone, mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":190,"context_line":"                 garp_primary_delay\u003dGARP_PRIMARY_DELAY,"},{"line_number":191,"context_line":"                 vrrp_health_check_interval\u003d0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"61374299_8edc87a9","line":188,"range":{"start_line":188,"start_character":17,"end_line":188,"end_character":37},"updated":"2024-05-15 08:49:20.000000000","message":"New param should be added to the last, so the existing callers may not need to change the parmas order.","commit_id":"7f9d7189f13d4ddb8ce8688b6fcf0dedc5567130"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7a44683ec686325a7489810ae40753e29564c01c","unresolved":false,"context_lines":[{"line_number":185,"context_line":"    \"\"\"Instance section of a keepalived configuration.\"\"\""},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    def __init__(self, state, interface, vrouter_id, ha_cidrs,"},{"line_number":188,"context_line":"                 notify_script\u003dNone, priority\u003dHA_DEFAULT_PRIORITY,"},{"line_number":189,"context_line":"                 advert_int\u003dNone, mcast_src_ip\u003dNone, nopreempt\u003dFalse,"},{"line_number":190,"context_line":"                 garp_primary_delay\u003dGARP_PRIMARY_DELAY,"},{"line_number":191,"context_line":"                 vrrp_health_check_interval\u003d0,"}],"source_content_type":"text/x-python","patch_set":2,"id":"6adfaffb_e1703d1e","line":188,"range":{"start_line":188,"start_character":17,"end_line":188,"end_character":37},"in_reply_to":"61374299_8edc87a9","updated":"2024-05-16 13:05:56.000000000","message":"Done","commit_id":"7f9d7189f13d4ddb8ce8688b6fcf0dedc5567130"}],"neutron/agent/linux/utils.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2fc0587e7ab41e07d327ccb57292156362ec6eb0","unresolved":true,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def find_pids_by_cmd(cmd):"},{"line_number":184,"context_line":"    \"\"\"Retrieve a list of the pids by their cmd.\"\"\""},{"line_number":185,"context_line":"    pids \u003d execute([\u0027pgrep\u0027, \u0027-f\u0027, cmd], log_fail_as_error\u003dFalse)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    return pids.split()"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"33afc9da_6366bafe","line":185,"updated":"2024-11-12 23:01:30.000000000","message":"Should this use \u0027-o\u0027 to get oldest? I\u0027m assuming we want the parent process? Also, does caller ever not just use the first in the list?","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7f2421f2cd74c1bfe6752501a01ef70004e62d20","unresolved":false,"context_lines":[{"line_number":182,"context_line":""},{"line_number":183,"context_line":"def find_pids_by_cmd(cmd):"},{"line_number":184,"context_line":"    \"\"\"Retrieve a list of the pids by their cmd.\"\"\""},{"line_number":185,"context_line":"    pids \u003d execute([\u0027pgrep\u0027, \u0027-f\u0027, cmd], log_fail_as_error\u003dFalse)"},{"line_number":186,"context_line":""},{"line_number":187,"context_line":"    return pids.split()"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":8,"id":"67cca479_b28f33a1","line":185,"in_reply_to":"33afc9da_6366bafe","updated":"2024-11-14 23:11:34.000000000","message":"There is currently only 1 caller and it does not care about anything but the first PID. I changed the code to check that there is only 1 PID for the command and to return just this PID.","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":8313,"name":"Lajos Katona","display_name":"lajoskatona","email":"katonalala@gmail.com","username":"elajkat","status":"Ericsson Software Technology"},"change_message_id":"4997010166a4690ae3b64e61cc24aba2d97ade4a","unresolved":true,"context_lines":[{"line_number":182,"context_line":"    return child_pids"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"def find_pid_by_cmd(cmd):"},{"line_number":186,"context_line":"    \"\"\"Retrieve a list of the pids by their cmd.\"\"\""},{"line_number":187,"context_line":"    pids \u003d execute([\u0027pgrep\u0027, \u0027-f\u0027, cmd], log_fail_as_error\u003dFalse).split()"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"719f7006_589b608f","line":185,"updated":"2024-12-06 13:32:03.000000000","message":"there is already a pgrep method in tests/common/helper.py:\nhttps://opendev.org/openstack/neutron/src/branch/master/neutron/tests/common/helpers.py#L267\n\nCould you please move that to some common place instead of duplication if you need another round? FUP patch is also ok for me","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    return child_pids"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"def find_pid_by_cmd(cmd):"},{"line_number":186,"context_line":"    \"\"\"Retrieve a list of the pids by their cmd.\"\"\""},{"line_number":187,"context_line":"    pids \u003d execute([\u0027pgrep\u0027, \u0027-f\u0027, cmd], log_fail_as_error\u003dFalse).split()"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"db003b42_c9a20b9d","line":185,"in_reply_to":"33fc608e_8e9d72e1","updated":"2025-01-09 13:22:41.000000000","message":"As I had to do another round anyway I moved the pgrep function to agent/linux/utils.py and used that.","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"b72039fea94a3a3be6fc8a7fc4d0e153ff6ca66b","unresolved":false,"context_lines":[{"line_number":182,"context_line":"    return child_pids"},{"line_number":183,"context_line":""},{"line_number":184,"context_line":""},{"line_number":185,"context_line":"def find_pid_by_cmd(cmd):"},{"line_number":186,"context_line":"    \"\"\"Retrieve a list of the pids by their cmd.\"\"\""},{"line_number":187,"context_line":"    pids \u003d execute([\u0027pgrep\u0027, \u0027-f\u0027, cmd], log_fail_as_error\u003dFalse).split()"},{"line_number":188,"context_line":""}],"source_content_type":"text/x-python","patch_set":10,"id":"33fc608e_8e9d72e1","line":185,"in_reply_to":"719f7006_589b608f","updated":"2024-12-12 23:40:33.000000000","message":"Will submit a followup patch once this is merged.","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"}],"neutron/conf/agent/l3/ha.py":[{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2fc0587e7ab41e07d327ccb57292156362ec6eb0","unresolved":true,"context_lines":[{"line_number":55,"context_line":"                      \u0027in a round-robin fashion, until one of the routers \u0027"},{"line_number":56,"context_line":"                      \u0027restores the gateway connection.\u0027)),"},{"line_number":57,"context_line":"    cfg.BoolOpt(\u0027ha_conntrackd_enabled\u0027,"},{"line_number":58,"context_line":"                default\u003dTrue,"},{"line_number":59,"context_line":"                help\u003d_(\"Enable conntrackd to synchronize connection \""},{"line_number":60,"context_line":"                       \"tracking states between HA routers.\")),"},{"line_number":61,"context_line":"    cfg.IntOpt(\u0027ha_conntrackd_hashsize\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"811efd26_a536c4a6","line":58,"updated":"2024-11-12 23:01:30.000000000","message":"It seems like the default should be False to not impact anyone that upgrades, since they might not have conntrackd installed, or want to use it.","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7f2421f2cd74c1bfe6752501a01ef70004e62d20","unresolved":false,"context_lines":[{"line_number":55,"context_line":"                      \u0027in a round-robin fashion, until one of the routers \u0027"},{"line_number":56,"context_line":"                      \u0027restores the gateway connection.\u0027)),"},{"line_number":57,"context_line":"    cfg.BoolOpt(\u0027ha_conntrackd_enabled\u0027,"},{"line_number":58,"context_line":"                default\u003dTrue,"},{"line_number":59,"context_line":"                help\u003d_(\"Enable conntrackd to synchronize connection \""},{"line_number":60,"context_line":"                       \"tracking states between HA routers.\")),"},{"line_number":61,"context_line":"    cfg.IntOpt(\u0027ha_conntrackd_hashsize\u0027,"}],"source_content_type":"text/x-python","patch_set":8,"id":"460251a7_6b6d357f","line":58,"in_reply_to":"811efd26_a536c4a6","updated":"2024-11-14 23:11:34.000000000","message":"Changed to False. We can always revisit this later on.","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":1131,"name":"Brian Haley","email":"haleyb.dev@gmail.com","username":"brian-haley"},"change_message_id":"2fc0587e7ab41e07d327ccb57292156362ec6eb0","unresolved":true,"context_lines":[{"line_number":80,"context_line":"    cfg.IntOpt(\u0027ha_conntrackd_group\u0027,"},{"line_number":81,"context_line":"               default\u003d3780,"},{"line_number":82,"context_line":"               help\u003d_(\u0027The multicast base port number. The generated virtual \u0027"},{"line_number":83,"context_line":"                      \u0027router ID added to this vaule.\u0027)),"},{"line_number":84,"context_line":"    cfg.IntOpt(\u0027ha_conntrackd_sndsocketbuffer\u0027,"},{"line_number":85,"context_line":"               default\u003d24985600,"},{"line_number":86,"context_line":"               help\u003d_(\u0027Buffer used to enqueue the packets that are going \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"1a91094d_cabe3eef","line":83,"range":{"start_line":83,"start_character":47,"end_line":83,"end_character":52},"updated":"2024-11-12 23:01:30.000000000","message":"s/value","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"7f2421f2cd74c1bfe6752501a01ef70004e62d20","unresolved":false,"context_lines":[{"line_number":80,"context_line":"    cfg.IntOpt(\u0027ha_conntrackd_group\u0027,"},{"line_number":81,"context_line":"               default\u003d3780,"},{"line_number":82,"context_line":"               help\u003d_(\u0027The multicast base port number. The generated virtual \u0027"},{"line_number":83,"context_line":"                      \u0027router ID added to this vaule.\u0027)),"},{"line_number":84,"context_line":"    cfg.IntOpt(\u0027ha_conntrackd_sndsocketbuffer\u0027,"},{"line_number":85,"context_line":"               default\u003d24985600,"},{"line_number":86,"context_line":"               help\u003d_(\u0027Buffer used to enqueue the packets that are going \u0027"}],"source_content_type":"text/x-python","patch_set":8,"id":"9f3135ac_ec3f1d56","line":83,"range":{"start_line":83,"start_character":47,"end_line":83,"end_character":52},"in_reply_to":"1a91094d_cabe3eef","updated":"2024-11-14 23:11:34.000000000","message":"Done","commit_id":"62667ee2604278a04f4546ab86daa1ac9a5d70d5"}],"neutron/tests/fullstack/resources/config.py":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":69,"context_line":"        self.config.update({"},{"line_number":70,"context_line":"            \u0027DEFAULT\u0027: {"},{"line_number":71,"context_line":"                \u0027host\u0027: self._generate_host(),"},{"line_number":72,"context_line":"                # Enable conntrackd for tests to get full test coverage"},{"line_number":73,"context_line":"                \u0027ha_conntrackd_enabled\u0027: \u0027True\u0027,"},{"line_number":74,"context_line":"                # Conntrackd only supports 107 characters for it\u0027s control"},{"line_number":75,"context_line":"                # socket path. Thus the \"state_path\" should not be nested in"}],"source_content_type":"text/x-python","patch_set":10,"id":"d64331e9_8e5178e5","line":72,"updated":"2024-12-19 00:27:24.000000000","message":"In case someone else wondering, the service is already installed by devstack since Ic32d913c2bc6fae339b4d5ec509a77df5a21de72 though apparently we never completed conntrackd integration till now. :) So no need to e.g. update bindep.txt to include the dependency. (Or at least no hard requirements. It may still be wise to keep the dependency in bindep.txt too...)","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":69,"context_line":"        self.config.update({"},{"line_number":70,"context_line":"            \u0027DEFAULT\u0027: {"},{"line_number":71,"context_line":"                \u0027host\u0027: self._generate_host(),"},{"line_number":72,"context_line":"                # Enable conntrackd for tests to get full test coverage"},{"line_number":73,"context_line":"                \u0027ha_conntrackd_enabled\u0027: \u0027True\u0027,"},{"line_number":74,"context_line":"                # Conntrackd only supports 107 characters for it\u0027s control"},{"line_number":75,"context_line":"                # socket path. Thus the \"state_path\" should not be nested in"}],"source_content_type":"text/x-python","patch_set":10,"id":"96ab546a_ba106a9b","line":72,"in_reply_to":"d64331e9_8e5178e5","updated":"2025-01-09 13:22:41.000000000","message":"I added it to bindep.txt for the test and conntrackd profiles. I choose to use a separate profile because this is an optional feature.","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":71,"context_line":"                \u0027host\u0027: self._generate_host(),"},{"line_number":72,"context_line":"                # Enable conntrackd for tests to get full test coverage"},{"line_number":73,"context_line":"                \u0027ha_conntrackd_enabled\u0027: \u0027True\u0027,"},{"line_number":74,"context_line":"                # Conntrackd only supports 107 characters for it\u0027s control"},{"line_number":75,"context_line":"                # socket path. Thus the \"state_path\" should not be nested in"},{"line_number":76,"context_line":"                # a temporary directory to avoid the final path being too long."},{"line_number":77,"context_line":"                \u0027state_path\u0027: self.temp_dir,"}],"source_content_type":"text/x-python","patch_set":10,"id":"a58c9001_d8240f27","line":74,"updated":"2024-12-19 00:27:24.000000000","message":"nit: it\u0027s -\u003e its","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":71,"context_line":"                \u0027host\u0027: self._generate_host(),"},{"line_number":72,"context_line":"                # Enable conntrackd for tests to get full test coverage"},{"line_number":73,"context_line":"                \u0027ha_conntrackd_enabled\u0027: \u0027True\u0027,"},{"line_number":74,"context_line":"                # Conntrackd only supports 107 characters for it\u0027s control"},{"line_number":75,"context_line":"                # socket path. Thus the \"state_path\" should not be nested in"},{"line_number":76,"context_line":"                # a temporary directory to avoid the final path being too long."},{"line_number":77,"context_line":"                \u0027state_path\u0027: self.temp_dir,"}],"source_content_type":"text/x-python","patch_set":10,"id":"e7fb9485_c06619bf","line":74,"in_reply_to":"a58c9001_d8240f27","updated":"2025-01-09 13:22:41.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"}],"releasenotes/notes/ha-router-conntrackd-support-6bc8b039fc3ac207.yaml":[{"author":{"_account_id":9656,"name":"Ihar Hrachyshka","email":"ihrachys@redhat.com","username":"ihrachys","status":"Red Hat Networking Systems Engineer"},"change_message_id":"a783c2fb0dd331582829ed3a4a299375ae9dfe6d","unresolved":true,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    HA routers can now run \"conntrackd\" in addition to \"keepalived\" to"},{"line_number":5,"context_line":"    synchronize connection tracking states accross router instances. This"},{"line_number":6,"context_line":"    ensures that established connections survive a HA router failover. L3 agent"},{"line_number":7,"context_line":"    hosts must have the \"conntrackd\" binary installed."},{"line_number":8,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"0c9206ea_cf0bf484","line":5,"updated":"2024-12-19 00:27:24.000000000","message":"across","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"},{"author":{"_account_id":11290,"name":"Gaudenz Steinlin","email":"gaudenz.steinlin@cloudscale.ch","username":"gaudenz"},"change_message_id":"32563f70dbd2ab1a94f3c379c53f94a963d3aa79","unresolved":false,"context_lines":[{"line_number":2,"context_line":"features:"},{"line_number":3,"context_line":"  - |"},{"line_number":4,"context_line":"    HA routers can now run \"conntrackd\" in addition to \"keepalived\" to"},{"line_number":5,"context_line":"    synchronize connection tracking states accross router instances. This"},{"line_number":6,"context_line":"    ensures that established connections survive a HA router failover. L3 agent"},{"line_number":7,"context_line":"    hosts must have the \"conntrackd\" binary installed."},{"line_number":8,"context_line":""}],"source_content_type":"text/x-yaml","patch_set":10,"id":"eb8a28df_78b57a59","line":5,"in_reply_to":"0c9206ea_cf0bf484","updated":"2025-01-09 13:22:41.000000000","message":"Done","commit_id":"b164d67f452ee3bd2b64d836202161580a93c2b4"}]}
