)]}'
{"metropolis/node/kubernetes/labelmaker.go":[{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":63,"context_line":"func getIntendedLabelsPerNode(node *ipb.Node) labels {"},{"line_number":64,"context_line":"\tlabels :\u003d make(map[string]string)"},{"line_number":65,"context_line":"\tif node.Roles.ConsensusMember !\u003d nil {"},{"line_number":66,"context_line":"\t\tlabels[\"node-role.kubernetes.io/ConsensusMember\"] \u003d \"true\""},{"line_number":67,"context_line":"\t}"},{"line_number":68,"context_line":"\tif node.Roles.KubernetesController !\u003d nil {"},{"line_number":69,"context_line":"\t\tlabels[\"node-role.kubernetes.io/KubernetesController\"] \u003d \"true\""}],"source_content_type":"text/x-go","patch_set":3,"id":"def8ab29_b0e0d803","line":66,"range":{"start_line":66,"start_character":54,"end_line":66,"end_character":60},"updated":"2024-10-01 17:23:32.000000000","message":"kubeadm uses the empty string for role label values instead of \"true\", so I would suggest to also use \"\" here.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":63,"context_line":"func getIntendedLabelsPerNode(node *ipb.Node) labels {"},{"line_number":64,"context_line":"\tlabels :\u003d make(map[string]string)"},{"line_number":65,"context_line":"\tif node.Roles.ConsensusMember !\u003d nil {"},{"line_number":66,"context_line":"\t\tlabels[\"node-role.kubernetes.io/ConsensusMember\"] \u003d \"true\""},{"line_number":67,"context_line":"\t}"},{"line_number":68,"context_line":"\tif node.Roles.KubernetesController !\u003d nil {"},{"line_number":69,"context_line":"\t\tlabels[\"node-role.kubernetes.io/KubernetesController\"] \u003d \"true\""}],"source_content_type":"text/x-go","patch_set":3,"id":"bce239f0_e08ff1a7","line":66,"range":{"start_line":66,"start_character":54,"end_line":66,"end_character":60},"in_reply_to":"def8ab29_b0e0d803","updated":"2024-10-07 17:25:07.000000000","message":"Done","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":92,"context_line":"// labelsEqual returns true if labels a and b are equal."},{"line_number":93,"context_line":"func labelsEqual(a, b labels) bool {"},{"line_number":94,"context_line":"\tfor k, v :\u003d range a {"},{"line_number":95,"context_line":"\t\tif b[k] !\u003d v {"},{"line_number":96,"context_line":"\t\t\treturn false"},{"line_number":97,"context_line":"\t\t}"},{"line_number":98,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"8d3df494_2f41c6d8","line":95,"range":{"start_line":95,"start_character":5,"end_line":95,"end_character":14},"updated":"2024-10-01 17:23:32.000000000","message":"Label values can be empty, so this should also check if the label exists in the other map.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":92,"context_line":"// labelsEqual returns true if labels a and b are equal."},{"line_number":93,"context_line":"func labelsEqual(a, b labels) bool {"},{"line_number":94,"context_line":"\tfor k, v :\u003d range a {"},{"line_number":95,"context_line":"\t\tif b[k] !\u003d v {"},{"line_number":96,"context_line":"\t\t\treturn false"},{"line_number":97,"context_line":"\t\t}"},{"line_number":98,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"7715cd9a_db602be7","line":95,"range":{"start_line":95,"start_character":5,"end_line":95,"end_character":14},"in_reply_to":"8d3df494_2f41c6d8","updated":"2024-10-07 17:25:07.000000000","message":"Done","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":109,"context_line":"func (l labels) generateKubernetesApply(nid string) applycorev1.NodeApplyConfiguration {"},{"line_number":110,"context_line":"\tapiv :\u003d \"v1\""},{"line_number":111,"context_line":"\tkind :\u003d \"Node\""},{"line_number":112,"context_line":"\treturn applycorev1.NodeApplyConfiguration{"},{"line_number":113,"context_line":"\t\tTypeMetaApplyConfiguration: applymetav1.TypeMetaApplyConfiguration{"},{"line_number":114,"context_line":"\t\t\tKind:       \u0026kind,"},{"line_number":115,"context_line":"\t\t\tAPIVersion: \u0026apiv,"}],"source_content_type":"text/x-go","patch_set":3,"id":"1fcc9654_ba15cefc","line":112,"range":{"start_line":112,"start_character":8,"end_line":112,"end_character":42},"updated":"2024-10-01 17:23:32.000000000","message":"I would use `applycorev1.Node(nid)` instead of manually constructing this.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":109,"context_line":"func (l labels) generateKubernetesApply(nid string) applycorev1.NodeApplyConfiguration {"},{"line_number":110,"context_line":"\tapiv :\u003d \"v1\""},{"line_number":111,"context_line":"\tkind :\u003d \"Node\""},{"line_number":112,"context_line":"\treturn applycorev1.NodeApplyConfiguration{"},{"line_number":113,"context_line":"\t\tTypeMetaApplyConfiguration: applymetav1.TypeMetaApplyConfiguration{"},{"line_number":114,"context_line":"\t\t\tKind:       \u0026kind,"},{"line_number":115,"context_line":"\t\t\tAPIVersion: \u0026apiv,"}],"source_content_type":"text/x-go","patch_set":3,"id":"126676bf_e9bf62af","line":112,"range":{"start_line":112,"start_character":8,"end_line":112,"end_character":42},"in_reply_to":"1fcc9654_ba15cefc","updated":"2024-10-07 17:25:07.000000000","message":"Done","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":126,"context_line":"\tfor {"},{"line_number":127,"context_line":"\t\tctxT, ctxC :\u003d context.WithTimeout(ctx, time.Minute*10)"},{"line_number":128,"context_line":"\t\terr :\u003d l.runInner(ctxT)"},{"line_number":129,"context_line":"\t\tif errors.Is(err, ctxT.Err()) {"},{"line_number":130,"context_line":"\t\t\tcontinue"},{"line_number":131,"context_line":"\t\t}"},{"line_number":132,"context_line":"\t\tctxC()"}],"source_content_type":"text/x-go","patch_set":3,"id":"78873b92_a400ab0a","line":129,"range":{"start_line":129,"start_character":5,"end_line":129,"end_character":31},"updated":"2024-10-01 17:23:32.000000000","message":"Add ` \u0026\u0026 ctx.Err() \u003d\u003d nil`, otherwise this will spin and never return when the outer context is canceled.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"038e07677e034c53e5b3004cc2de2a6d343150b9","unresolved":true,"context_lines":[{"line_number":126,"context_line":"\tfor {"},{"line_number":127,"context_line":"\t\tctxT, ctxC :\u003d context.WithTimeout(ctx, time.Minute*10)"},{"line_number":128,"context_line":"\t\terr :\u003d l.runInner(ctxT)"},{"line_number":129,"context_line":"\t\tif errors.Is(err, ctxT.Err()) {"},{"line_number":130,"context_line":"\t\t\tcontinue"},{"line_number":131,"context_line":"\t\t}"},{"line_number":132,"context_line":"\t\tctxC()"}],"source_content_type":"text/x-go","patch_set":3,"id":"7051cebd_12260b81","line":129,"range":{"start_line":129,"start_character":5,"end_line":129,"end_character":31},"in_reply_to":"463e66ac_042934f9","updated":"2024-10-08 11:42:26.000000000","message":"I tested the code now. When the timeout expires, the grpc library returns an error which does not wrap the context error, so the errors.Is call returns false even if the error was caused by the timeout. Thus the runnable restarts each time the timeout expires.\n\nSo I would suggest to do something like this:\n\n```\n\t\tif ctxT.Err() \u003d\u003d nil || ctx.Err() !\u003d nil {\n\t\t\treturn err\n\t\t}\n```\n\nThis means we only restart if the timeout has expired, and the outer context has not been canceled yet.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"6190f7794c0055e68d09697fe5f40fca27c1a4ed","unresolved":false,"context_lines":[{"line_number":126,"context_line":"\tfor {"},{"line_number":127,"context_line":"\t\tctxT, ctxC :\u003d context.WithTimeout(ctx, time.Minute*10)"},{"line_number":128,"context_line":"\t\terr :\u003d l.runInner(ctxT)"},{"line_number":129,"context_line":"\t\tif errors.Is(err, ctxT.Err()) {"},{"line_number":130,"context_line":"\t\t\tcontinue"},{"line_number":131,"context_line":"\t\t}"},{"line_number":132,"context_line":"\t\tctxC()"}],"source_content_type":"text/x-go","patch_set":3,"id":"a08bcbb0_027bd0b1","line":129,"range":{"start_line":129,"start_character":5,"end_line":129,"end_character":31},"in_reply_to":"7051cebd_12260b81","updated":"2024-10-14 12:46:23.000000000","message":"Wow, what a mess, thanks for checking. We should check the rest of the codebase for this, I just assumed gRPC would wrap things correctly here...\n\nAlright, let\u0027s try this approach.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":126,"context_line":"\tfor {"},{"line_number":127,"context_line":"\t\tctxT, ctxC :\u003d context.WithTimeout(ctx, time.Minute*10)"},{"line_number":128,"context_line":"\t\terr :\u003d l.runInner(ctxT)"},{"line_number":129,"context_line":"\t\tif errors.Is(err, ctxT.Err()) {"},{"line_number":130,"context_line":"\t\t\tcontinue"},{"line_number":131,"context_line":"\t\t}"},{"line_number":132,"context_line":"\t\tctxC()"}],"source_content_type":"text/x-go","patch_set":3,"id":"463e66ac_042934f9","line":129,"range":{"start_line":129,"start_character":5,"end_line":129,"end_character":31},"in_reply_to":"78873b92_a400ab0a","updated":"2024-10-07 17:25:07.000000000","message":"Reworked this slightly, PTAL.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":161,"context_line":"\t\t\tif err :\u003d l.processClusterNode(ctx, node); err !\u003d nil {"},{"line_number":162,"context_line":"\t\t\t\tsupervisor.Logger(ctx).Warningf(\"Failed to process labels on node %s: %v\", node.Id, err)"},{"line_number":163,"context_line":"\t\t\t} else {"},{"line_number":164,"context_line":"\t\t\t\tsupervisor.Logger(ctx).Infof(\"Updated labels on node %s\", node.Id)"},{"line_number":165,"context_line":"\t\t\t}"},{"line_number":166,"context_line":"\t\t}"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"772e70e6_4e1782d3","line":164,"range":{"start_line":164,"start_character":4,"end_line":164,"end_character":70},"updated":"2024-10-01 17:23:32.000000000","message":"I would remove this log, as its quite spammy (1 line per node every 10 minutes, even when nothing changed) and not really needed.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":161,"context_line":"\t\t\tif err :\u003d l.processClusterNode(ctx, node); err !\u003d nil {"},{"line_number":162,"context_line":"\t\t\t\tsupervisor.Logger(ctx).Warningf(\"Failed to process labels on node %s: %v\", node.Id, err)"},{"line_number":163,"context_line":"\t\t\t} else {"},{"line_number":164,"context_line":"\t\t\t\tsupervisor.Logger(ctx).Infof(\"Updated labels on node %s\", node.Id)"},{"line_number":165,"context_line":"\t\t\t}"},{"line_number":166,"context_line":"\t\t}"},{"line_number":167,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"9e079044_b0c32e1f","line":164,"range":{"start_line":164,"start_character":4,"end_line":164,"end_character":70},"in_reply_to":"772e70e6_4e1782d3","updated":"2024-10-07 17:25:07.000000000","message":"Oh yeah, leftover debug.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":174,"context_line":"// processClusterNodes runs the label reconciliation algorithm on a single node."},{"line_number":175,"context_line":"// It requests current labels from Kubernetes and issues a server-side-apply"},{"line_number":176,"context_line":"// operation to bring them into the requested state, if there is a diff."},{"line_number":177,"context_line":"func (l *labelmaker) processClusterNode(ctx context.Context, node *ipb.Node) error {"},{"line_number":178,"context_line":"\tintent :\u003d getIntendedLabelsPerNode(node)"},{"line_number":179,"context_line":"\tstate, err :\u003d getCurrentLabelsForNode(ctx, l.clientSet, node.Id)"},{"line_number":180,"context_line":"\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"088ada5c_697389e4","line":177,"updated":"2024-10-01 17:23:32.000000000","message":"Server-side apply has the limitation that labels cannot be removed if they have not been managed by the same field manager. This means that, when the user adds a label to a node which passes filterManaged, processClusterNode will attempt to remove the label in each iteration, which never does anything.\n\nFor now, it\u0027s fine to just document this limitation. To fix it, you could for example inspect the managedFields, and if there is a label we want to remove but not managed by metropolis-labelmaker, then first do an Apply which contains the label, thus making it managed by metropolis-labelmaker, and then another Apply without the label to remove it.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":true,"context_lines":[{"line_number":174,"context_line":"// processClusterNodes runs the label reconciliation algorithm on a single node."},{"line_number":175,"context_line":"// It requests current labels from Kubernetes and issues a server-side-apply"},{"line_number":176,"context_line":"// operation to bring them into the requested state, if there is a diff."},{"line_number":177,"context_line":"func (l *labelmaker) processClusterNode(ctx context.Context, node *ipb.Node) error {"},{"line_number":178,"context_line":"\tintent :\u003d getIntendedLabelsPerNode(node)"},{"line_number":179,"context_line":"\tstate, err :\u003d getCurrentLabelsForNode(ctx, l.clientSet, node.Id)"},{"line_number":180,"context_line":"\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"a2568e99_d500a68c","line":177,"in_reply_to":"088ada5c_697389e4","updated":"2024-10-07 17:25:07.000000000","message":"I knew this when writing the code, so it\u0027s only about documenting this.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"6190f7794c0055e68d09697fe5f40fca27c1a4ed","unresolved":false,"context_lines":[{"line_number":174,"context_line":"// processClusterNodes runs the label reconciliation algorithm on a single node."},{"line_number":175,"context_line":"// It requests current labels from Kubernetes and issues a server-side-apply"},{"line_number":176,"context_line":"// operation to bring them into the requested state, if there is a diff."},{"line_number":177,"context_line":"func (l *labelmaker) processClusterNode(ctx context.Context, node *ipb.Node) error {"},{"line_number":178,"context_line":"\tintent :\u003d getIntendedLabelsPerNode(node)"},{"line_number":179,"context_line":"\tstate, err :\u003d getCurrentLabelsForNode(ctx, l.clientSet, node.Id)"},{"line_number":180,"context_line":"\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"33510b8f_b08aa47a","line":177,"in_reply_to":"a2568e99_d500a68c","updated":"2024-10-14 12:46:23.000000000","message":"(which I will do around the config proto, as I think that\u0027s the most pertinent place for this)","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":192,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Updating labels on node %s... \", node.Id)"},{"line_number":193,"context_line":"\tfor k, v :\u003d range state {"},{"line_number":194,"context_line":"\t\tif intent[k] !\u003d v {"},{"line_number":195,"context_line":"\t\t\tsupervisor.Logger(ctx).Infof(\"  Removing %s\", k)"},{"line_number":196,"context_line":"\t\t}"},{"line_number":197,"context_line":"\t}"},{"line_number":198,"context_line":"\tfor k, v :\u003d range intent {"}],"source_content_type":"text/x-go","patch_set":3,"id":"ae9c233e_a1b4b814","line":195,"range":{"start_line":195,"start_character":32,"end_line":195,"end_character":50},"updated":"2024-10-01 17:23:32.000000000","message":"```suggestion\n\t\t\tsupervisor.Logger(ctx).Infof(\"  Removing %s\u003d%q\", k, v)\n```\nAnd same for the log below.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":192,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Updating labels on node %s... \", node.Id)"},{"line_number":193,"context_line":"\tfor k, v :\u003d range state {"},{"line_number":194,"context_line":"\t\tif intent[k] !\u003d v {"},{"line_number":195,"context_line":"\t\t\tsupervisor.Logger(ctx).Infof(\"  Removing %s\", k)"},{"line_number":196,"context_line":"\t\t}"},{"line_number":197,"context_line":"\t}"},{"line_number":198,"context_line":"\tfor k, v :\u003d range intent {"}],"source_content_type":"text/x-go","patch_set":3,"id":"9457463f_ef267781","line":195,"range":{"start_line":195,"start_character":32,"end_line":195,"end_character":50},"in_reply_to":"ae9c233e_a1b4b814","updated":"2024-10-07 17:25:07.000000000","message":"Done","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":202,"context_line":"\t}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"\tnapply :\u003d intent.generateKubernetesApply(node.Id)"},{"line_number":205,"context_line":"\t_, err \u003d l.clientSet.CoreV1().Nodes().Apply(ctx, \u0026napply, v1.ApplyOptions{FieldManager: \"metropolis-labelmaker\"})"},{"line_number":206,"context_line":"\treturn err"},{"line_number":207,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":3,"id":"d36c4dba_68f0e17f","line":205,"range":{"start_line":205,"start_character":59,"end_line":205,"end_character":74},"updated":"2024-10-01 17:23:32.000000000","message":"It\u0027s recommended to set `Force: true` for automated controllers.\n\nhttps://kubernetes.io/docs/reference/using-api/server-side-apply/#using-server-side-apply-in-a-controller","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"038e07677e034c53e5b3004cc2de2a6d343150b9","unresolved":true,"context_lines":[{"line_number":202,"context_line":"\t}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"\tnapply :\u003d intent.generateKubernetesApply(node.Id)"},{"line_number":205,"context_line":"\t_, err \u003d l.clientSet.CoreV1().Nodes().Apply(ctx, \u0026napply, v1.ApplyOptions{FieldManager: \"metropolis-labelmaker\"})"},{"line_number":206,"context_line":"\treturn err"},{"line_number":207,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":3,"id":"e4d2578f_6adb03bb","line":205,"range":{"start_line":205,"start_character":59,"end_line":205,"end_character":74},"in_reply_to":"cdd567ed_8d425f8c","updated":"2024-10-08 11:42:26.000000000","message":"If we do have a NodeLabelsToSynchronizeToKubernetes config, then I\u0027d say this is enough explicit user intent to force synchronization.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":true,"context_lines":[{"line_number":202,"context_line":"\t}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"\tnapply :\u003d intent.generateKubernetesApply(node.Id)"},{"line_number":205,"context_line":"\t_, err \u003d l.clientSet.CoreV1().Nodes().Apply(ctx, \u0026napply, v1.ApplyOptions{FieldManager: \"metropolis-labelmaker\"})"},{"line_number":206,"context_line":"\treturn err"},{"line_number":207,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":3,"id":"cdd567ed_8d425f8c","line":205,"range":{"start_line":205,"start_character":59,"end_line":205,"end_character":74},"in_reply_to":"d36c4dba_68f0e17f","updated":"2024-10-07 17:25:07.000000000","message":"For these role-based labels `Force: true` should actually be fine. I\u0027ll have to think about how this should work for the label-to-label sync.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"6190f7794c0055e68d09697fe5f40fca27c1a4ed","unresolved":false,"context_lines":[{"line_number":202,"context_line":"\t}"},{"line_number":203,"context_line":""},{"line_number":204,"context_line":"\tnapply :\u003d intent.generateKubernetesApply(node.Id)"},{"line_number":205,"context_line":"\t_, err \u003d l.clientSet.CoreV1().Nodes().Apply(ctx, \u0026napply, v1.ApplyOptions{FieldManager: \"metropolis-labelmaker\"})"},{"line_number":206,"context_line":"\treturn err"},{"line_number":207,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":3,"id":"292f035b_bd236023","line":205,"range":{"start_line":205,"start_character":59,"end_line":205,"end_character":74},"in_reply_to":"e4d2578f_6adb03bb","updated":"2024-10-14 12:46:23.000000000","message":"Acknowledged","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"}],"metropolis/test/e2e/suites/kubernetes/run_test.go":[{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":127,"context_line":"\t\t\tt.Fatalf(\"Could not make %s a KubernetesWorker: %v\", nid, err)"},{"line_number":128,"context_line":"\t\t}"},{"line_number":129,"context_line":"\t}"},{"line_number":130,"context_line":"\ttime.Sleep(5 * time.Second)"},{"line_number":131,"context_line":"\t// Nodes should have role labels now."},{"line_number":132,"context_line":"\tfor _, nid :\u003d range cluster.NodeIDs {"},{"line_number":133,"context_line":"\t\twant :\u003d map[string]string{"}],"source_content_type":"text/x-go","patch_set":3,"id":"e1befd64_1958be23","line":130,"range":{"start_line":130,"start_character":1,"end_line":130,"end_character":28},"updated":"2024-10-01 17:23:32.000000000","message":"I would use MustTestEventual to make this more robust, and also faster, because that retries every second.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":127,"context_line":"\t\t\tt.Fatalf(\"Could not make %s a KubernetesWorker: %v\", nid, err)"},{"line_number":128,"context_line":"\t\t}"},{"line_number":129,"context_line":"\t}"},{"line_number":130,"context_line":"\ttime.Sleep(5 * time.Second)"},{"line_number":131,"context_line":"\t// Nodes should have role labels now."},{"line_number":132,"context_line":"\tfor _, nid :\u003d range cluster.NodeIDs {"},{"line_number":133,"context_line":"\t\twant :\u003d map[string]string{"}],"source_content_type":"text/x-go","patch_set":3,"id":"5b087876_fffea1e4","line":130,"range":{"start_line":130,"start_character":1,"end_line":130,"end_character":28},"in_reply_to":"e1befd64_1958be23","updated":"2024-10-07 17:25:07.000000000","message":"Done","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"50d58147cd8020c87ce0a00229d58c293a5bbc41","unresolved":true,"context_lines":[{"line_number":168,"context_line":"\t}"},{"line_number":169,"context_line":"}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"func labelsFilter(in map[string]string) map[string]string {"},{"line_number":172,"context_line":"\tprefixes :\u003d []string{"},{"line_number":173,"context_line":"\t\t\"node-role.kubernetes.io/\","},{"line_number":174,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"ecd82050_1e899319","line":171,"range":{"start_line":171,"start_character":5,"end_line":171,"end_character":17},"updated":"2024-10-01 17:23:32.000000000","message":"Why not import labelsFilter and labelsEqual instead of duplicating them here?","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"},{"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":"7e363757619dcdb74fa28cd2ebd84c1db34795a5","unresolved":false,"context_lines":[{"line_number":168,"context_line":"\t}"},{"line_number":169,"context_line":"}"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"func labelsFilter(in map[string]string) map[string]string {"},{"line_number":172,"context_line":"\tprefixes :\u003d []string{"},{"line_number":173,"context_line":"\t\t\"node-role.kubernetes.io/\","},{"line_number":174,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"fafd31db_e3c9f2fa","line":171,"range":{"start_line":171,"start_character":5,"end_line":171,"end_character":17},"in_reply_to":"ecd82050_1e899319","updated":"2024-10-07 17:25:07.000000000","message":"Done, factored out to node.Labels etc.","commit_id":"454f75c2b7e8d2015ddc7826f14e627fd97cffe1"}]}
