)]}'
{"/PATCHSET_LEVEL":[{"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":"b159aae84e53d95841582fc77b2b48a1710dbb0b","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"f0cbdabd_58ccede0","updated":"2023-06-06 14:59:24.000000000","message":"Currently checking if this change introduced more flakiness, that test is related to DNS.","commit_id":"ba642b6e59dfdcc88d63f32b8c61c5147c2eba5a"},{"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":"7eb0af268f86600a3b61ef1052fd2f763c4db357","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"b37074d0_d25d926a","updated":"2023-06-12 16:21:01.000000000","message":"Since we want to deploy this very soon and CoreDNS is very broken with dynamically adding/removing listeners, I changed the setup to statically assign all of this until the new DNS frontend is ready.","commit_id":"ba642b6e59dfdcc88d63f32b8c61c5147c2eba5a"},{"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":"e9d47e5f38a28c989f72341b02ce0037b998f562","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":2,"id":"89c97eb4_6d15d3f7","in_reply_to":"f0cbdabd_58ccede0","updated":"2023-06-06 23:15:28.000000000","message":"The answer is yes, because CoreDNS reloads are unreliable (not our fault though). Forcibly restarting CoreDNS for every change makes the test succeed reliably. I\u0027ll see what I\u0027ll do about it.","commit_id":"ba642b6e59dfdcc88d63f32b8c61c5147c2eba5a"}],"metropolis/node/core/network/dns/directives.go":[{"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":"d34facabcd1cc2d1528d74b9b98a7cf5a77dfa47","unresolved":true,"context_lines":[{"line_number":71,"context_line":"// kubeconfig needs at least read access to services, endpoints and"},{"line_number":72,"context_line":"// endpointslices."},{"line_number":73,"context_line":"//   [1] https://github.com/kubernetes/dns/blob/master/docs/specification.md"},{"line_number":74,"context_line":"func NewKubernetesDirective(clusterDomain string, dnsSvcIP net.IP, kubeconfig []byte) *ExtraDirective {"},{"line_number":75,"context_line":"\tvar prefix string"},{"line_number":76,"context_line":"\tif len(dnsSvcIP) \u003e 0 {"},{"line_number":77,"context_line":"\t\tprefix \u003d fmt.Sprintf(bindDirective, dnsSvcIP)"}],"source_content_type":"text/x-go","patch_set":1,"id":"f6902ba1_4d5f9fec","line":74,"range":{"start_line":74,"start_character":50,"end_line":74,"end_character":65},"updated":"2023-06-05 16:02:14.000000000","message":"Document this argument.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"fb7998fc4daf6efd34457cd1dbfb7dd2857fe63d","unresolved":false,"context_lines":[{"line_number":71,"context_line":"// kubeconfig needs at least read access to services, endpoints and"},{"line_number":72,"context_line":"// endpointslices."},{"line_number":73,"context_line":"//   [1] https://github.com/kubernetes/dns/blob/master/docs/specification.md"},{"line_number":74,"context_line":"func NewKubernetesDirective(clusterDomain string, dnsSvcIP net.IP, kubeconfig []byte) *ExtraDirective {"},{"line_number":75,"context_line":"\tvar prefix string"},{"line_number":76,"context_line":"\tif len(dnsSvcIP) \u003e 0 {"},{"line_number":77,"context_line":"\t\tprefix \u003d fmt.Sprintf(bindDirective, dnsSvcIP)"}],"source_content_type":"text/x-go","patch_set":1,"id":"87ac615c_61e9d945","line":74,"range":{"start_line":74,"start_character":50,"end_line":74,"end_character":65},"in_reply_to":"f6902ba1_4d5f9fec","updated":"2023-06-06 14:29:36.000000000","message":"Done","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"}],"metropolis/node/core/network/main.go":[{"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":"d34facabcd1cc2d1528d74b9b98a7cf5a77dfa47","unresolved":true,"context_lines":[{"line_number":139,"context_line":"// to bind listeners to. Once this function returns, the IP is assigned and is"},{"line_number":140,"context_line":"// ready to use. It\u0027s recommended to use defer to call ReleaseLocalIP to make"},{"line_number":141,"context_line":"// sure IPs are released when the goroutine using it exits."},{"line_number":142,"context_line":"func (s *Service) UseLocalIP(ip net.IP) error {"},{"line_number":143,"context_line":"\tloopbackIf, err :\u003d netlink.LinkByName(\"lo\")"},{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"7eaa2c04_629c13be","line":142,"range":{"start_line":142,"start_character":18,"end_line":142,"end_character":28},"updated":"2023-06-05 16:02:14.000000000","message":"AddLoopbackIP? That seems more self-descriptive.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"d34facabcd1cc2d1528d74b9b98a7cf5a77dfa47","unresolved":true,"context_lines":[{"line_number":139,"context_line":"// to bind listeners to. Once this function returns, the IP is assigned and is"},{"line_number":140,"context_line":"// ready to use. It\u0027s recommended to use defer to call ReleaseLocalIP to make"},{"line_number":141,"context_line":"// sure IPs are released when the goroutine using it exits."},{"line_number":142,"context_line":"func (s *Service) UseLocalIP(ip net.IP) error {"},{"line_number":143,"context_line":"\tloopbackIf, err :\u003d netlink.LinkByName(\"lo\")"},{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"205aa1bc_791a67a0","line":142,"range":{"start_line":142,"start_character":5,"end_line":142,"end_character":18},"updated":"2023-06-05 16:02:14.000000000","message":"Why not define this as a free-standing function?","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"fb7998fc4daf6efd34457cd1dbfb7dd2857fe63d","unresolved":true,"context_lines":[{"line_number":139,"context_line":"// to bind listeners to. Once this function returns, the IP is assigned and is"},{"line_number":140,"context_line":"// ready to use. It\u0027s recommended to use defer to call ReleaseLocalIP to make"},{"line_number":141,"context_line":"// sure IPs are released when the goroutine using it exits."},{"line_number":142,"context_line":"func (s *Service) UseLocalIP(ip net.IP) error {"},{"line_number":143,"context_line":"\tloopbackIf, err :\u003d netlink.LinkByName(\"lo\")"},{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"294fe9c2_6b6cde0d","line":142,"range":{"start_line":142,"start_character":5,"end_line":142,"end_character":18},"in_reply_to":"205aa1bc_791a67a0","updated":"2023-06-06 14:29:36.000000000","message":"It\u0027s currently implemented without relying on any fields from the network service itself, but I wanted to leave the option open.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"4340baec826f092e41cdb7283c5e3ddb57d6982f","unresolved":true,"context_lines":[{"line_number":139,"context_line":"// to bind listeners to. Once this function returns, the IP is assigned and is"},{"line_number":140,"context_line":"// ready to use. It\u0027s recommended to use defer to call ReleaseLocalIP to make"},{"line_number":141,"context_line":"// sure IPs are released when the goroutine using it exits."},{"line_number":142,"context_line":"func (s *Service) UseLocalIP(ip net.IP) error {"},{"line_number":143,"context_line":"\tloopbackIf, err :\u003d netlink.LinkByName(\"lo\")"},{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"97f37f40_746e9ab8","line":142,"range":{"start_line":142,"start_character":5,"end_line":142,"end_character":18},"in_reply_to":"294fe9c2_6b6cde0d","updated":"2023-06-07 10:22:33.000000000","message":"No need to design for the future here. We manage the entire codebase and if we need to refactor, we\u0027ll refactor.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"fb7998fc4daf6efd34457cd1dbfb7dd2857fe63d","unresolved":false,"context_lines":[{"line_number":139,"context_line":"// to bind listeners to. Once this function returns, the IP is assigned and is"},{"line_number":140,"context_line":"// ready to use. It\u0027s recommended to use defer to call ReleaseLocalIP to make"},{"line_number":141,"context_line":"// sure IPs are released when the goroutine using it exits."},{"line_number":142,"context_line":"func (s *Service) UseLocalIP(ip net.IP) error {"},{"line_number":143,"context_line":"\tloopbackIf, err :\u003d netlink.LinkByName(\"lo\")"},{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"20d8f51a_f4f16974","line":142,"range":{"start_line":142,"start_character":18,"end_line":142,"end_character":28},"in_reply_to":"7eaa2c04_629c13be","updated":"2023-06-06 14:29:36.000000000","message":"Done","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"7eb0af268f86600a3b61ef1052fd2f763c4db357","unresolved":false,"context_lines":[{"line_number":139,"context_line":"// to bind listeners to. Once this function returns, the IP is assigned and is"},{"line_number":140,"context_line":"// ready to use. It\u0027s recommended to use defer to call ReleaseLocalIP to make"},{"line_number":141,"context_line":"// sure IPs are released when the goroutine using it exits."},{"line_number":142,"context_line":"func (s *Service) UseLocalIP(ip net.IP) error {"},{"line_number":143,"context_line":"\tloopbackIf, err :\u003d netlink.LinkByName(\"lo\")"},{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"}],"source_content_type":"text/x-go","patch_set":1,"id":"0dfa60ec_8532e261","line":142,"range":{"start_line":142,"start_character":5,"end_line":142,"end_character":18},"in_reply_to":"97f37f40_746e9ab8","updated":"2023-06-12 16:21:01.000000000","message":"Done","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"d34facabcd1cc2d1528d74b9b98a7cf5a77dfa47","unresolved":true,"context_lines":[{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"},{"line_number":146,"context_line":"\t}"},{"line_number":147,"context_line":"\tif err :\u003d netlink.AddrAdd(loopbackIf, singleIPtoNetlinkAddr(ip, \"localsvc\")); err !\u003d nil {"},{"line_number":148,"context_line":"\t\treturn fmt.Errorf(\"failed to add IP: %w\", err)"},{"line_number":149,"context_line":"\t}"},{"line_number":150,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":1,"id":"bd9a0170_a7962583","line":147,"range":{"start_line":147,"start_character":19,"end_line":147,"end_character":26},"updated":"2023-06-05 16:02:14.000000000","message":"Is this idempotent? If not, can we make it?","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"4340baec826f092e41cdb7283c5e3ddb57d6982f","unresolved":true,"context_lines":[{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"},{"line_number":146,"context_line":"\t}"},{"line_number":147,"context_line":"\tif err :\u003d netlink.AddrAdd(loopbackIf, singleIPtoNetlinkAddr(ip, \"localsvc\")); err !\u003d nil {"},{"line_number":148,"context_line":"\t\treturn fmt.Errorf(\"failed to add IP: %w\", err)"},{"line_number":149,"context_line":"\t}"},{"line_number":150,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":1,"id":"2cacf48d_03cd2602","line":147,"range":{"start_line":147,"start_character":19,"end_line":147,"end_character":26},"in_reply_to":"16b17a15_ba6e0234","updated":"2023-06-07 10:22:33.000000000","message":"If we\u0027re going with the add/remove of loopbacks as part of kubernetes bringup/teardown then I would definitely try to make this idempotent to hopefully be a bit more resilient to intermittent failures and service crashes.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"7eb0af268f86600a3b61ef1052fd2f763c4db357","unresolved":false,"context_lines":[{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"},{"line_number":146,"context_line":"\t}"},{"line_number":147,"context_line":"\tif err :\u003d netlink.AddrAdd(loopbackIf, singleIPtoNetlinkAddr(ip, \"localsvc\")); err !\u003d nil {"},{"line_number":148,"context_line":"\t\treturn fmt.Errorf(\"failed to add IP: %w\", err)"},{"line_number":149,"context_line":"\t}"},{"line_number":150,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":1,"id":"571f9771_e57f5d39","line":147,"range":{"start_line":147,"start_character":19,"end_line":147,"end_character":26},"in_reply_to":"2cacf48d_03cd2602","updated":"2023-06-12 16:21:01.000000000","message":"Done","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"fb7998fc4daf6efd34457cd1dbfb7dd2857fe63d","unresolved":true,"context_lines":[{"line_number":144,"context_line":"\tif err !\u003d nil {"},{"line_number":145,"context_line":"\t\treturn fmt.Errorf(\"no loopback interface: %w\", err)"},{"line_number":146,"context_line":"\t}"},{"line_number":147,"context_line":"\tif err :\u003d netlink.AddrAdd(loopbackIf, singleIPtoNetlinkAddr(ip, \"localsvc\")); err !\u003d nil {"},{"line_number":148,"context_line":"\t\treturn fmt.Errorf(\"failed to add IP: %w\", err)"},{"line_number":149,"context_line":"\t}"},{"line_number":150,"context_line":"\treturn nil"}],"source_content_type":"text/x-go","patch_set":1,"id":"16b17a15_ba6e0234","line":147,"range":{"start_line":147,"start_character":19,"end_line":147,"end_character":26},"in_reply_to":"bd9a0170_a7962583","updated":"2023-06-06 14:29:36.000000000","message":"It\u0027s definitely possible, just need to ignore the exists error from Netlink. Question is if this is a good idea. I initially did this as a context-based API, but I was unhappy with the additional goroutine per lease.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"}],"metropolis/node/kubernetes/service_worker.go":[{"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":"d34facabcd1cc2d1528d74b9b98a7cf5a77dfa47","unresolved":true,"context_lines":[{"line_number":217,"context_line":"\t\t{\"clusternet\", clusternet.Run},"},{"line_number":218,"context_line":"\t\t{\"nfproxy\", nfproxy.Run},"},{"line_number":219,"context_line":"\t\t{\"kvmdeviceplugin\", kvmDevicePlugin.Run},"},{"line_number":220,"context_line":"\t\t{\"kubelet\", kubelet.Run},"},{"line_number":221,"context_line":"\t} {"},{"line_number":222,"context_line":"\t\terr :\u003d supervisor.Run(ctx, sub.name, sub.runnable)"},{"line_number":223,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":1,"id":"67e24a11_5ec0b88e","line":220,"range":{"start_line":220,"start_character":14,"end_line":220,"end_character":25},"updated":"2023-06-05 16:02:14.000000000","message":"The kubelet was wrapped in \u0027networked\u0027 so that it restarts if the machine\u0027s external address changes. Isn\u0027t this still necessary?","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"4340baec826f092e41cdb7283c5e3ddb57d6982f","unresolved":false,"context_lines":[{"line_number":217,"context_line":"\t\t{\"clusternet\", clusternet.Run},"},{"line_number":218,"context_line":"\t\t{\"nfproxy\", nfproxy.Run},"},{"line_number":219,"context_line":"\t\t{\"kvmdeviceplugin\", kvmDevicePlugin.Run},"},{"line_number":220,"context_line":"\t\t{\"kubelet\", kubelet.Run},"},{"line_number":221,"context_line":"\t} {"},{"line_number":222,"context_line":"\t\terr :\u003d supervisor.Run(ctx, sub.name, sub.runnable)"},{"line_number":223,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":1,"id":"ec39bdf0_4aec71ef","line":220,"range":{"start_line":220,"start_character":14,"end_line":220,"end_character":25},"in_reply_to":"0e102f4c_e0790e96","updated":"2023-06-07 10:22:33.000000000","message":"Ack","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"fb7998fc4daf6efd34457cd1dbfb7dd2857fe63d","unresolved":true,"context_lines":[{"line_number":217,"context_line":"\t\t{\"clusternet\", clusternet.Run},"},{"line_number":218,"context_line":"\t\t{\"nfproxy\", nfproxy.Run},"},{"line_number":219,"context_line":"\t\t{\"kvmdeviceplugin\", kvmDevicePlugin.Run},"},{"line_number":220,"context_line":"\t\t{\"kubelet\", kubelet.Run},"},{"line_number":221,"context_line":"\t} {"},{"line_number":222,"context_line":"\t\terr :\u003d supervisor.Run(ctx, sub.name, sub.runnable)"},{"line_number":223,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":1,"id":"0e102f4c_e0790e96","line":220,"range":{"start_line":220,"start_character":14,"end_line":220,"end_character":25},"in_reply_to":"67e24a11_5ec0b88e","updated":"2023-06-06 14:29:36.000000000","message":"No, the only dependency on that external address was for the DNS. Since that\u0027s now done through a link-local IP which never changes that\u0027s no longer necessary.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"d34facabcd1cc2d1528d74b9b98a7cf5a77dfa47","unresolved":true,"context_lines":[{"line_number":226,"context_line":"\t}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Allocating %v for container DNS\", containerDNSIP)"},{"line_number":229,"context_line":"\tif err :\u003d s.c.Network.UseLocalIP(containerDNSIP); err !\u003d nil {"},{"line_number":230,"context_line":"\t\treturn fmt.Errorf(\"failed to use local IP for container DNS: %w\", err)"},{"line_number":231,"context_line":"\t}"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-go","patch_set":1,"id":"c78ef484_902daa14","line":229,"range":{"start_line":229,"start_character":1,"end_line":229,"end_character":63},"updated":"2023-06-05 16:02:14.000000000","message":"It might be easier to just always add this loopback on startup of every node, instead of attempting to add/remove it only when running k8s?","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"4340baec826f092e41cdb7283c5e3ddb57d6982f","unresolved":true,"context_lines":[{"line_number":226,"context_line":"\t}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Allocating %v for container DNS\", containerDNSIP)"},{"line_number":229,"context_line":"\tif err :\u003d s.c.Network.UseLocalIP(containerDNSIP); err !\u003d nil {"},{"line_number":230,"context_line":"\t\treturn fmt.Errorf(\"failed to use local IP for container DNS: %w\", err)"},{"line_number":231,"context_line":"\t}"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-go","patch_set":1,"id":"d3b83503_1c8b4f61","line":229,"range":{"start_line":229,"start_character":1,"end_line":229,"end_character":63},"in_reply_to":"6c1eca61_11e351ab","updated":"2023-06-07 10:22:33.000000000","message":"Then maybe parametrize/configure the network service with \u0027additional loopbacks\u0027 instead?","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"fb7998fc4daf6efd34457cd1dbfb7dd2857fe63d","unresolved":true,"context_lines":[{"line_number":226,"context_line":"\t}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Allocating %v for container DNS\", containerDNSIP)"},{"line_number":229,"context_line":"\tif err :\u003d s.c.Network.UseLocalIP(containerDNSIP); err !\u003d nil {"},{"line_number":230,"context_line":"\t\treturn fmt.Errorf(\"failed to use local IP for container DNS: %w\", err)"},{"line_number":231,"context_line":"\t}"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-go","patch_set":1,"id":"6c1eca61_11e351ab","line":229,"range":{"start_line":229,"start_character":1,"end_line":229,"end_character":63},"in_reply_to":"c78ef484_902daa14","updated":"2023-06-06 14:29:36.000000000","message":"Yes, but the network service isn\u0027t just used by the Metropolis node, but also by various other builds.","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"},{"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":"7eb0af268f86600a3b61ef1052fd2f763c4db357","unresolved":false,"context_lines":[{"line_number":226,"context_line":"\t}"},{"line_number":227,"context_line":""},{"line_number":228,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Allocating %v for container DNS\", containerDNSIP)"},{"line_number":229,"context_line":"\tif err :\u003d s.c.Network.UseLocalIP(containerDNSIP); err !\u003d nil {"},{"line_number":230,"context_line":"\t\treturn fmt.Errorf(\"failed to use local IP for container DNS: %w\", err)"},{"line_number":231,"context_line":"\t}"},{"line_number":232,"context_line":""}],"source_content_type":"text/x-go","patch_set":1,"id":"1831dc9a_751cf23a","line":229,"range":{"start_line":229,"start_character":1,"end_line":229,"end_character":63},"in_reply_to":"d3b83503_1c8b4f61","updated":"2023-06-12 16:21:01.000000000","message":"Done","commit_id":"f35224ab9327eff971a20984da485e59c2fc09ce"}]}
