)]}'
{"metropolis/node/core/clusternet/clusternet.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"0780e824b4d154fc912c034aded9275b7a75ce6a","unresolved":true,"context_lines":[{"line_number":9,"context_line":"// implications:"},{"line_number":10,"context_line":"//"},{"line_number":11,"context_line":"// First, we only have a single real route on the host into the wireguard"},{"line_number":12,"context_line":"// networking mesh, and that is configured ahead of time in the Service as"},{"line_number":13,"context_line":"// ClusterNet. All destination addresses that should be carried by the mesh must"},{"line_number":14,"context_line":"// thus be part of this single route. Otherwise traffic will be able to flow into"},{"line_number":15,"context_line":"// the node from other nodes, but will exit through another interface. This is is"}],"source_content_type":"text/x-go","patch_set":5,"id":"420a6a15_d0355b9c","line":12,"range":{"start_line":12,"start_character":3,"end_line":12,"end_character":18},"updated":"2023-03-30 12:37:38.000000000","message":"network interface?","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7549bc6a867e0a69e11d6c349c4692f055878c2a","unresolved":false,"context_lines":[{"line_number":9,"context_line":"// implications:"},{"line_number":10,"context_line":"//"},{"line_number":11,"context_line":"// First, we only have a single real route on the host into the wireguard"},{"line_number":12,"context_line":"// networking mesh, and that is configured ahead of time in the Service as"},{"line_number":13,"context_line":"// ClusterNet. All destination addresses that should be carried by the mesh must"},{"line_number":14,"context_line":"// thus be part of this single route. Otherwise traffic will be able to flow into"},{"line_number":15,"context_line":"// the node from other nodes, but will exit through another interface. This is is"}],"source_content_type":"text/x-go","patch_set":5,"id":"4064662f_51da972c","line":12,"range":{"start_line":12,"start_character":3,"end_line":12,"end_character":18},"in_reply_to":"420a6a15_d0355b9c","updated":"2023-03-30 14:45:34.000000000","message":"Done","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"0780e824b4d154fc912c034aded9275b7a75ce6a","unresolved":true,"context_lines":[{"line_number":151,"context_line":"\t\t}"},{"line_number":152,"context_line":"\t\tfor _, n :\u003d range updated {"},{"line_number":153,"context_line":"\t\t\tsupervisor.Logger(ctx).Infof(\"Node %s updated: pk %s, address %s, prefixes %v\", n.id, n.pubkey, n.address, n.prefixes)"},{"line_number":154,"context_line":"\t\t\tif err :\u003d s.wg.configurePeer(n); err !\u003d nil {"},{"line_number":155,"context_line":"\t\t\t\t// Do nothing, but maybe we should crash instead to let the service re-create the"},{"line_number":156,"context_line":"\t\t\t\t// interface from scratch/"},{"line_number":157,"context_line":"\t\t\t\tsupervisor.Logger(ctx).Errorf(\"Node %s couldn\u0027t be configured: %v\", n.id, err)"}],"source_content_type":"text/x-go","patch_set":5,"id":"b1030b20_9944ec4e","line":154,"range":{"start_line":154,"start_character":13,"end_line":154,"end_character":31},"updated":"2023-03-30 12:37:38.000000000","message":"You could emit a single WireGuard ConfigureDevice call for an entire (updated, removed) set. I actually first thought the current implementation would be O(n^2) because of the rebuilding of all of the access structures on the kernel side, but it\u0027s actually all O(1) there because WireGuard is implemented so well, so it\u0027s O(n) in total which is asymptotically optimal. But we\u0027re still doing n round-trips as well as syscalls where we could be doing 1.","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7549bc6a867e0a69e11d6c349c4692f055878c2a","unresolved":false,"context_lines":[{"line_number":151,"context_line":"\t\t}"},{"line_number":152,"context_line":"\t\tfor _, n :\u003d range updated {"},{"line_number":153,"context_line":"\t\t\tsupervisor.Logger(ctx).Infof(\"Node %s updated: pk %s, address %s, prefixes %v\", n.id, n.pubkey, n.address, n.prefixes)"},{"line_number":154,"context_line":"\t\t\tif err :\u003d s.wg.configurePeer(n); err !\u003d nil {"},{"line_number":155,"context_line":"\t\t\t\t// Do nothing, but maybe we should crash instead to let the service re-create the"},{"line_number":156,"context_line":"\t\t\t\t// interface from scratch/"},{"line_number":157,"context_line":"\t\t\t\tsupervisor.Logger(ctx).Errorf(\"Node %s couldn\u0027t be configured: %v\", n.id, err)"}],"source_content_type":"text/x-go","patch_set":5,"id":"20321499_64b19217","line":154,"range":{"start_line":154,"start_character":13,"end_line":154,"end_character":31},"in_reply_to":"b1030b20_9944ec4e","updated":"2023-03-30 14:45:34.000000000","message":"Done","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"}],"metropolis/node/core/clusternet/clusternet_test.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"0780e824b4d154fc912c034aded9275b7a75ce6a","unresolved":true,"context_lines":[{"line_number":340,"context_line":"\t// Do it again."},{"line_number":341,"context_line":"\twg.close()"},{"line_number":342,"context_line":"\tif err :\u003d wg.setup(\u0026cnet); err !\u003d nil {"},{"line_number":343,"context_line":"\t\tt.Fatalf(\"Failed to setup interface seconf time: %v\", err)"},{"line_number":344,"context_line":"\t}"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"\t// Check that the key and listen port are configured correctly."}],"source_content_type":"text/x-go","patch_set":5,"id":"a8ababab_4a6a7984","line":343,"range":{"start_line":343,"start_character":38,"end_line":343,"end_character":44},"updated":"2023-03-30 12:37:38.000000000","message":"second","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7549bc6a867e0a69e11d6c349c4692f055878c2a","unresolved":false,"context_lines":[{"line_number":340,"context_line":"\t// Do it again."},{"line_number":341,"context_line":"\twg.close()"},{"line_number":342,"context_line":"\tif err :\u003d wg.setup(\u0026cnet); err !\u003d nil {"},{"line_number":343,"context_line":"\t\tt.Fatalf(\"Failed to setup interface seconf time: %v\", err)"},{"line_number":344,"context_line":"\t}"},{"line_number":345,"context_line":""},{"line_number":346,"context_line":"\t// Check that the key and listen port are configured correctly."}],"source_content_type":"text/x-go","patch_set":5,"id":"43a9dbab_fa9cceb6","line":343,"range":{"start_line":343,"start_character":38,"end_line":343,"end_character":44},"in_reply_to":"a8ababab_4a6a7984","updated":"2023-03-30 14:45:34.000000000","message":"Done","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"}],"metropolis/node/core/clusternet/netlink_compat.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"0780e824b4d154fc912c034aded9275b7a75ce6a","unresolved":true,"context_lines":[{"line_number":14,"context_line":"// See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"// limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"// Can be removed once https://github.com/vishvananda/netlink/pull/464 lands"},{"line_number":18,"context_line":"package clusternet"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import \"github.com/vishvananda/netlink\""}],"source_content_type":"text/x-go","patch_set":5,"id":"8cb4cfb7_4ae0df3a","line":17,"range":{"start_line":17,"start_character":23,"end_line":17,"end_character":76},"updated":"2023-03-30 12:37:38.000000000","message":"We\u0027re using a forked netlink based upon a much newer version than upstream, we have that PR.","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7549bc6a867e0a69e11d6c349c4692f055878c2a","unresolved":false,"context_lines":[{"line_number":14,"context_line":"// See the License for the specific language governing permissions and"},{"line_number":15,"context_line":"// limitations under the License."},{"line_number":16,"context_line":""},{"line_number":17,"context_line":"// Can be removed once https://github.com/vishvananda/netlink/pull/464 lands"},{"line_number":18,"context_line":"package clusternet"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import \"github.com/vishvananda/netlink\""}],"source_content_type":"text/x-go","patch_set":5,"id":"af4438e7_a00ab994","line":17,"range":{"start_line":17,"start_character":23,"end_line":17,"end_character":76},"in_reply_to":"8cb4cfb7_4ae0df3a","updated":"2023-03-30 14:45:34.000000000","message":"Done","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"}],"metropolis/node/core/clusternet/types.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"0780e824b4d154fc912c034aded9275b7a75ce6a","unresolved":true,"context_lines":[{"line_number":50,"context_line":"\t\t}"},{"line_number":51,"context_line":"\t\tnewPrefixes \u003d append(newPrefixes, prefix.Cidr)"},{"line_number":52,"context_line":"\t}"},{"line_number":53,"context_line":"\tif want, got :\u003d strings.Join(newPrefixes, \",\"), strings.Join(n.prefixes, \",\"); want !\u003d got {"},{"line_number":54,"context_line":"\t\tn.prefixes \u003d newPrefixes"},{"line_number":55,"context_line":"\t\tchanged \u003d true"},{"line_number":56,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"41bdca42_c86fada9","line":53,"range":{"start_line":53,"start_character":30,"end_line":53,"end_character":41},"updated":"2023-03-30 12:37:38.000000000","message":"Both newPrefixes as well as n.prefixes need to be sorted for this comparison to be valid.","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7549bc6a867e0a69e11d6c349c4692f055878c2a","unresolved":false,"context_lines":[{"line_number":50,"context_line":"\t\t}"},{"line_number":51,"context_line":"\t\tnewPrefixes \u003d append(newPrefixes, prefix.Cidr)"},{"line_number":52,"context_line":"\t}"},{"line_number":53,"context_line":"\tif want, got :\u003d strings.Join(newPrefixes, \",\"), strings.Join(n.prefixes, \",\"); want !\u003d got {"},{"line_number":54,"context_line":"\t\tn.prefixes \u003d newPrefixes"},{"line_number":55,"context_line":"\t\tchanged \u003d true"},{"line_number":56,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"c0cfec0c_3e8b66dc","line":53,"range":{"start_line":53,"start_character":30,"end_line":53,"end_character":41},"in_reply_to":"41bdca42_c86fada9","updated":"2023-03-30 14:45:34.000000000","message":"Done","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"}],"metropolis/node/core/clusternet/wireguard.go":[{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"0780e824b4d154fc912c034aded9275b7a75ce6a","unresolved":true,"context_lines":[{"line_number":77,"context_line":"\t\treturn fmt.Errorf(\"could not list links: %w\", err)"},{"line_number":78,"context_line":"\t}"},{"line_number":79,"context_line":"\tfor _, link :\u003d range links {"},{"line_number":80,"context_line":"\t\tif link.Attrs().Name !\u003d clusterNetDeviceName {"},{"line_number":81,"context_line":"\t\t\tcontinue"},{"line_number":82,"context_line":"\t\t}"},{"line_number":83,"context_line":"\t\tif err :\u003d netlink.LinkDel(link); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"81b9db61_c9a434b4","line":80,"range":{"start_line":80,"start_character":26,"end_line":80,"end_character":46},"updated":"2023-03-30 12:37:38.000000000","message":"This can easily conflict with core/network. Let\u0027s say I named ToR uplinkg bond `clusternet` (not that unreasonable), then you\u0027ve just cut off the node from network access for no discernible reason. Either core/network needs a list of reserved interface names which it is not allowed to use or core/network needs an API to get conflict-free interface names. Advantage of the second approach is that you can ask for any number of interfaces, disadvantage is that the names you\u0027ll get are no longer static. I have no strong opinion on which one to pick. I can handle the core/network side of this once we decide on one approach.","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"97f739dbaf1a053985a6f85857e5a475816d68ab","unresolved":false,"context_lines":[{"line_number":77,"context_line":"\t\treturn fmt.Errorf(\"could not list links: %w\", err)"},{"line_number":78,"context_line":"\t}"},{"line_number":79,"context_line":"\tfor _, link :\u003d range links {"},{"line_number":80,"context_line":"\t\tif link.Attrs().Name !\u003d clusterNetDeviceName {"},{"line_number":81,"context_line":"\t\t\tcontinue"},{"line_number":82,"context_line":"\t\t}"},{"line_number":83,"context_line":"\t\tif err :\u003d netlink.LinkDel(link); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"8ab16b35_7b7160ff","line":80,"range":{"start_line":80,"start_character":26,"end_line":80,"end_character":46},"in_reply_to":"2d17be0b_07558f53","updated":"2023-03-30 15:10:04.000000000","message":"No, I\u0027ll put another change on top which changes out clusterNetDeviceName for a reference in some common package.","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7549bc6a867e0a69e11d6c349c4692f055878c2a","unresolved":true,"context_lines":[{"line_number":77,"context_line":"\t\treturn fmt.Errorf(\"could not list links: %w\", err)"},{"line_number":78,"context_line":"\t}"},{"line_number":79,"context_line":"\tfor _, link :\u003d range links {"},{"line_number":80,"context_line":"\t\tif link.Attrs().Name !\u003d clusterNetDeviceName {"},{"line_number":81,"context_line":"\t\t\tcontinue"},{"line_number":82,"context_line":"\t\t}"},{"line_number":83,"context_line":"\t\tif err :\u003d netlink.LinkDel(link); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"2d17be0b_07558f53","line":80,"range":{"start_line":80,"start_character":26,"end_line":80,"end_character":46},"in_reply_to":"81b9db61_c9a434b4","updated":"2023-03-30 14:45:34.000000000","message":"I think I\u0027d rather go with the first. Do I need to do anything more in this change to implement that?","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"0780e824b4d154fc912c034aded9275b7a75ce6a","unresolved":true,"context_lines":[{"line_number":104,"context_line":"\t\treturn fmt.Errorf(\"when setting up device: %w\", err)"},{"line_number":105,"context_line":"\t}"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"\tif err :\u003d netlink.RouteAdd(\u0026netlink.Route{"},{"line_number":108,"context_line":"\t\tDst:       clusterNet,"},{"line_number":109,"context_line":"\t\tLinkIndex: wgInterface.Index,"},{"line_number":110,"context_line":"\t}); err !\u003d nil \u0026\u0026 !os.IsExist(err) {"}],"source_content_type":"text/x-go","patch_set":5,"id":"82392b4e_2c7f651d","line":107,"range":{"start_line":107,"start_character":37,"end_line":107,"end_character":42},"updated":"2023-03-30 12:37:38.000000000","message":"Please define a protocol number for clusternet (just use something 128 \u003c x \u003c 255, only needs to be unique within Metropolis) and use it here (`Protocol: YourConstant`), otherwise we\u0027ll have trouble keeping our routes straight with multiple services managing them.","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"},{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7549bc6a867e0a69e11d6c349c4692f055878c2a","unresolved":false,"context_lines":[{"line_number":104,"context_line":"\t\treturn fmt.Errorf(\"when setting up device: %w\", err)"},{"line_number":105,"context_line":"\t}"},{"line_number":106,"context_line":""},{"line_number":107,"context_line":"\tif err :\u003d netlink.RouteAdd(\u0026netlink.Route{"},{"line_number":108,"context_line":"\t\tDst:       clusterNet,"},{"line_number":109,"context_line":"\t\tLinkIndex: wgInterface.Index,"},{"line_number":110,"context_line":"\t}); err !\u003d nil \u0026\u0026 !os.IsExist(err) {"}],"source_content_type":"text/x-go","patch_set":5,"id":"7fa05a23_0b911150","line":107,"range":{"start_line":107,"start_character":37,"end_line":107,"end_character":42},"in_reply_to":"82392b4e_2c7f651d","updated":"2023-03-30 14:45:34.000000000","message":"Done","commit_id":"09b541f33f01586c505ceb3e2dc44bb3de7a0a17"}]}
