)]}'
{"/PATCHSET_LEVEL":[{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"4802e07727067ed5216d04922802bf910794bfad","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"760136ac_fd4ebe42","updated":"2022-03-04 16:03:22.000000000","message":"I just realized this is incomplete as per what was written down in issue #99 (points 1 and 5). I\u0027ll be getting back to that. I presume that\u0027s gonna be additive changes only, so while I\u0027ll be marking this as WIP, I\u0027d still appreciate a review in the meantime.","commit_id":"1580be6e3e7b8b37f93a417bdf6639fdb3a828de"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"444a8bba51cb5f7d71d416041f7d05f8c374a03a","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"c6ffc443_a7cf3408","updated":"2022-03-03 20:30:41.000000000","message":"q3k: I\u0027m not sure about the Curator test:\na) I couldn\u0027t re-use otherNodeConn, because I needed to authenticate with Join Credentials. Since it\u0027s only used in the Register Flow test, wouldn\u0027t it be better to refactor it away?\nb) Pulling a *leadership out of fakeLeader() and using it to access internal Curator methods seems invasive, but it let me test precisely the implementation I was after. Is there a better approach?","commit_id":"1580be6e3e7b8b37f93a417bdf6639fdb3a828de"},{"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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a8abfb82_2e81f449","updated":"2022-03-22 12:12:19.000000000","message":"Sorry for the high latency on this one. The large size was a bit demotivating.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c54c3ebeaba0d631f0a27d1539810e3550812736","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"329c0166_831a9c56","updated":"2022-04-08 17:38:03.000000000","message":"Let me know if you\u0027d rather review it in a split form (join flow + test code). I thought it might be easier to just roll this change due to Gerrit\u0027s diff feature making it a bit easier to spot the parts that actually changed between revisions.","commit_id":"774d523f5f0788639f2e8fe24e0da51467e970d4"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"2919c66a435a51b04e2d697e0a2caff95b3a68fa","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"3dd88590_40f8a42b","in_reply_to":"329c0166_831a9c56","updated":"2022-04-08 17:49:30.000000000","message":"Some of the changes highlighted are due to the rebase.","commit_id":"774d523f5f0788639f2e8fe24e0da51467e970d4"},{"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":"036d8926bb83fe2e8379aca4b905edd0d0bb0d2c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"1ba494f4_61e67c1d","updated":"2022-04-19 11:48:14.000000000","message":"I think to test rebooting the first node we need to first have curator failover, no? Pretty sure this won\u0027t work without that.","commit_id":"72d9113fe3f96da55d00f34c73d93b7e4dc62c38"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"31642f13af8f1229ee5cf9f1ed2ea83c3735c5e1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"c56cdb01_379b22ad","updated":"2022-04-13 07:09:15.000000000","message":"This thing still doesn\u0027t test the bootstrapped node\u0027s rejoins (node 0). Hang on.","commit_id":"72d9113fe3f96da55d00f34c73d93b7e4dc62c38"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"a3d757ecda32f7e024e94a6742b57869fef37277","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":14,"id":"27719789_17cebb03","updated":"2022-04-22 16:54:28.000000000","message":"I moved parts of the implementation to other changes in this patchset.","commit_id":"805e52b17de9eed18d6f498915a33b8a8eecb794"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"01425d99d37b6b28af80628aad92ba832a061beb","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":16,"id":"47a784b6_a8d85ba7","updated":"2022-04-25 14:08:22.000000000","message":"I split this change so that it could be reviewed more easily.","commit_id":"e33912fb6eea90be6de453092123563e77021657"}],"metropolis/node/core/cluster/cluster.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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":270,"context_line":"// curatorRemote returns a host:port pair pointing at one of the cluster\u0027s"},{"line_number":271,"context_line":"// available Curator endpoints. It will return an empty string, and an error,"},{"line_number":272,"context_line":"// if the cluster directory is empty."},{"line_number":273,"context_line":"// MVP: this should be properly client-side loadbalanced."},{"line_number":274,"context_line":"func curatorRemote(cd *cpb.ClusterDirectory) (string, error) {"},{"line_number":275,"context_line":"\tif len(cd.Nodes) \u003d\u003d 0 {"},{"line_number":276,"context_line":"\t\treturn \"\", fmt.Errorf(\"the Cluster Directory is empty.\")"}],"source_content_type":"text/x-go","patch_set":5,"id":"459c45db_04e33e56","line":273,"updated":"2022-03-22 12:12:19.000000000","message":"// TODO(issues/117): use dynamic cluster client instead","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":false,"context_lines":[{"line_number":270,"context_line":"// curatorRemote returns a host:port pair pointing at one of the cluster\u0027s"},{"line_number":271,"context_line":"// available Curator endpoints. It will return an empty string, and an error,"},{"line_number":272,"context_line":"// if the cluster directory is empty."},{"line_number":273,"context_line":"// MVP: this should be properly client-side loadbalanced."},{"line_number":274,"context_line":"func curatorRemote(cd *cpb.ClusterDirectory) (string, error) {"},{"line_number":275,"context_line":"\tif len(cd.Nodes) \u003d\u003d 0 {"},{"line_number":276,"context_line":"\t\treturn \"\", fmt.Errorf(\"the Cluster Directory is empty.\")"}],"source_content_type":"text/x-go","patch_set":5,"id":"454d7e6b_0347a851","line":273,"in_reply_to":"459c45db_04e33e56","updated":"2022-03-26 11:22:29.000000000","message":"Done","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":280,"context_line":"\t\treturn \"\", fmt.Errorf(\"the first node in the Cluster Directory doesn\u0027t have an associated Address.\")"},{"line_number":281,"context_line":"\t}"},{"line_number":282,"context_line":"\tr :\u003d n.Addresses[0].Host"},{"line_number":283,"context_line":"\treturn net.JoinHostPort(r, strconv.Itoa(int(node.CuratorServicePort))), nil"},{"line_number":284,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":5,"id":"29c0ae62_1f3cd259","line":283,"range":{"start_line":283,"start_character":28,"end_line":283,"end_character":70},"updated":"2022-03-22 12:12:19.000000000","message":"node.CuratorServicePort.PortString()","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":false,"context_lines":[{"line_number":280,"context_line":"\t\treturn \"\", fmt.Errorf(\"the first node in the Cluster Directory doesn\u0027t have an associated Address.\")"},{"line_number":281,"context_line":"\t}"},{"line_number":282,"context_line":"\tr :\u003d n.Addresses[0].Host"},{"line_number":283,"context_line":"\treturn net.JoinHostPort(r, strconv.Itoa(int(node.CuratorServicePort))), nil"},{"line_number":284,"context_line":"}"}],"source_content_type":"text/x-go","patch_set":5,"id":"99a73d1e_a42e72fc","line":283,"range":{"start_line":283,"start_character":28,"end_line":283,"end_character":70},"in_reply_to":"29c0ae62_1f3cd259","updated":"2022-03-26 11:22:29.000000000","message":"Done","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"}],"metropolis/node/core/cluster/cluster_register.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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":104,"context_line":"\tif err !\u003d nil {"},{"line_number":105,"context_line":"\t\treturn fmt.Errorf(\"could not generate join keypair: %w\", err)"},{"line_number":106,"context_line":"\t}"},{"line_number":107,"context_line":"\tsc.JoinKey \u003d jpriv.Seed()"},{"line_number":108,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Registering: join public key: %s\", hex.EncodeToString([]byte(jpub)))"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"\t// Register this node."}],"source_content_type":"text/x-go","patch_set":5,"id":"235a0ce1_49f4ffcf","line":107,"range":{"start_line":107,"start_character":14,"end_line":107,"end_character":26},"updated":"2022-03-22 12:12:19.000000000","message":"Do we use ed25519 privkey seeds anywhere else? I thought we always dealt with raw bytes, I\u0027d like to be consistent here.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":false,"context_lines":[{"line_number":104,"context_line":"\tif err !\u003d nil {"},{"line_number":105,"context_line":"\t\treturn fmt.Errorf(\"could not generate join keypair: %w\", err)"},{"line_number":106,"context_line":"\t}"},{"line_number":107,"context_line":"\tsc.JoinKey \u003d jpriv.Seed()"},{"line_number":108,"context_line":"\tsupervisor.Logger(ctx).Infof(\"Registering: join public key: %s\", hex.EncodeToString([]byte(jpub)))"},{"line_number":109,"context_line":""},{"line_number":110,"context_line":"\t// Register this node."}],"source_content_type":"text/x-go","patch_set":5,"id":"d9f5de54_ee188045","line":107,"range":{"start_line":107,"start_character":14,"end_line":107,"end_character":26},"in_reply_to":"235a0ce1_49f4ffcf","updated":"2022-03-26 11:22:29.000000000","message":"We don\u0027t. I\u0027ll change it into a 64-byte raw key.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"}],"metropolis/node/core/curator/impl_leader_curator.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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":423,"context_line":"\tpi :\u003d rpc.GetPeerInfo(ctx)"},{"line_number":424,"context_line":"\tif pi \u003d\u003d nil || pi.Unauthenticated \u003d\u003d nil {"},{"line_number":425,"context_line":"\t\treturn nil, status.Error(codes.PermissionDenied, \"connection must be established with a self-signed ephemeral certificate\")"},{"line_number":426,"context_line":"\t}"},{"line_number":427,"context_line":"\t// The node will attempt to connect using its Join Key. jkey will contain"},{"line_number":428,"context_line":"\t// its public part."},{"line_number":429,"context_line":"\tjkey :\u003d pi.Unauthenticated.SelfSignedPublicKey"}],"source_content_type":"text/x-go","patch_set":5,"id":"8ae11433_9315ee27","line":426,"updated":"2022-03-22 12:12:19.000000000","message":"Take muNodes here to prevent internal Curator races.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c54c3ebeaba0d631f0a27d1539810e3550812736","unresolved":false,"context_lines":[{"line_number":423,"context_line":"\tpi :\u003d rpc.GetPeerInfo(ctx)"},{"line_number":424,"context_line":"\tif pi \u003d\u003d nil || pi.Unauthenticated \u003d\u003d nil {"},{"line_number":425,"context_line":"\t\treturn nil, status.Error(codes.PermissionDenied, \"connection must be established with a self-signed ephemeral certificate\")"},{"line_number":426,"context_line":"\t}"},{"line_number":427,"context_line":"\t// The node will attempt to connect using its Join Key. jkey will contain"},{"line_number":428,"context_line":"\t// its public part."},{"line_number":429,"context_line":"\tjkey :\u003d pi.Unauthenticated.SelfSignedPublicKey"}],"source_content_type":"text/x-go","patch_set":5,"id":"23ddeb36_3c8102bd","line":426,"in_reply_to":"4e24c389_18a95f52","updated":"2022-04-08 17:38:03.000000000","message":"Done","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":true,"context_lines":[{"line_number":423,"context_line":"\tpi :\u003d rpc.GetPeerInfo(ctx)"},{"line_number":424,"context_line":"\tif pi \u003d\u003d nil || pi.Unauthenticated \u003d\u003d nil {"},{"line_number":425,"context_line":"\t\treturn nil, status.Error(codes.PermissionDenied, \"connection must be established with a self-signed ephemeral certificate\")"},{"line_number":426,"context_line":"\t}"},{"line_number":427,"context_line":"\t// The node will attempt to connect using its Join Key. jkey will contain"},{"line_number":428,"context_line":"\t// its public part."},{"line_number":429,"context_line":"\tjkey :\u003d pi.Unauthenticated.SelfSignedPublicKey"}],"source_content_type":"text/x-go","patch_set":5,"id":"90c5d3a2_a58f8274","line":426,"in_reply_to":"8ae11433_9315ee27","updated":"2022-03-26 11:22:29.000000000","message":"I thought about it, but isn\u0027t it that since we\u0027re not changing Curator\u0027s state here, this implementation can only intermittently fail if the node information is removed from etcd during the call? Such a failure would still be non-critical, as the node can retry the call.\n\nIntuitively, there could be a performance impact of taking the mutex here in large clusters, as this would effectively serialize the requests, though the effect isn\u0027t measureable now.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"6a042f4642dbbae98905ed9c89996b4f73e0e866","unresolved":true,"context_lines":[{"line_number":423,"context_line":"\tpi :\u003d rpc.GetPeerInfo(ctx)"},{"line_number":424,"context_line":"\tif pi \u003d\u003d nil || pi.Unauthenticated \u003d\u003d nil {"},{"line_number":425,"context_line":"\t\treturn nil, status.Error(codes.PermissionDenied, \"connection must be established with a self-signed ephemeral certificate\")"},{"line_number":426,"context_line":"\t}"},{"line_number":427,"context_line":"\t// The node will attempt to connect using its Join Key. jkey will contain"},{"line_number":428,"context_line":"\t// its public part."},{"line_number":429,"context_line":"\tjkey :\u003d pi.Unauthenticated.SelfSignedPublicKey"}],"source_content_type":"text/x-go","patch_set":5,"id":"4e24c389_18a95f52","line":426,"in_reply_to":"90c5d3a2_a58f8274","updated":"2022-03-29 10:04:48.000000000","message":"It\u0027s intermittent but still a data race that will cause weird errors that someone might end up debugging.\n\nI\u0027d take the lock for safety, and we can then worry about performance whenever we get to it (and we\u0027re much more likely to be limited by etcd linearization, anyway).","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"}],"metropolis/node/core/curator/state_node.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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"\t// Build an etcd operation to map the node\u0027s Join Key into its ID for use in"},{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"82dfff29_99ab4250","line":324,"range":{"start_line":324,"start_character":1,"end_line":324,"end_character":20},"updated":"2022-03-22 12:12:19.000000000","message":"Do we ever expect to not have a node with a join key?","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"6a042f4642dbbae98905ed9c89996b4f73e0e866","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"\t// Build an etcd operation to map the node\u0027s Join Key into its ID for use in"},{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"c67a0fa3_03fc8348","line":324,"range":{"start_line":324,"start_character":1,"end_line":324,"end_character":20},"in_reply_to":"1cf36535_241829ee","updated":"2022-03-29 10:04:48.000000000","message":"Wait, so does the initial bootstrapping node end up not having a join key then?","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7822f696ef537ad99230be59e49ca88bba153509","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"\t// Build an etcd operation to map the node\u0027s Join Key into its ID for use in"},{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"1cf36535_241829ee","line":324,"range":{"start_line":324,"start_character":1,"end_line":324,"end_character":20},"in_reply_to":"78356fec_d058362c","updated":"2022-03-28 09:16:35.000000000","message":"BTW it\u0027s thrown me off for a bit. I don\u0027t remember why I put that check there in the first place, but removing it led to failures in bootstrap code, with error codes that somehow didn\u0027t propagate to node logs.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"\t// Build an etcd operation to map the node\u0027s Join Key into its ID for use in"},{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"78356fec_d058362c","line":324,"range":{"start_line":324,"start_character":1,"end_line":324,"end_character":20},"in_reply_to":"82dfff29_99ab4250","updated":"2022-03-26 11:22:29.000000000","message":"In the bootstrap code. It also simplifies a bunch of tests, since the join key doesn\u0027t have to be generated where it isn\u0027t needed. Take a look at metropolis/node/core/curator/bootstrap.go:114.\n\nIs there any point in changing the bootstrap code for the sake of consistency here?","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"7ba0d66a99afa932f81749cb9535cf771f3ce8ef","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"\t// Build an etcd operation to map the node\u0027s Join Key into its ID for use in"},{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"bdf273d2_b75f8b89","line":324,"range":{"start_line":324,"start_character":1,"end_line":324,"end_character":20},"in_reply_to":"b56f0d73_5fda7974","updated":"2022-03-29 11:43:06.000000000","message":"Then we need to implement this somehow - the first node needs a join key just as the rest of the nodes do. Testing this now in an e2e test won\u0027t be possible as we still can\u0027t fail over the first node, but it will be soon.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c54c3ebeaba0d631f0a27d1539810e3550812736","unresolved":false,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"\t// Build an etcd operation to map the node\u0027s Join Key into its ID for use in"},{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"c6e71b9a_6b2e7ea4","line":324,"range":{"start_line":324,"start_character":1,"end_line":324,"end_character":20},"in_reply_to":"bdf273d2_b75f8b89","updated":"2022-04-08 17:38:03.000000000","message":"This is now implemented, together with saving of the bootstrapped node\u0027s configuration (see: worker_controlplane.go).","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"6d806a09e44b342561b7188e556198ed9456fb0a","unresolved":true,"context_lines":[{"line_number":321,"context_line":""},{"line_number":322,"context_line":"\t// Build an etcd operation to map the node\u0027s Join Key into its ID for use in"},{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":5,"id":"b56f0d73_5fda7974","line":324,"range":{"start_line":324,"start_character":1,"end_line":324,"end_character":20},"in_reply_to":"c67a0fa3_03fc8348","updated":"2022-03-29 11:03:02.000000000","message":"As far as I understand the code flow, yes. See Manager.Run in metropolis/node/core/cluster/cluster.go - the bootstrap and join paths seem to be disjoint there, at first glance.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"},{"line_number":328,"context_line":"\t\t\t// TODO(issues/85): log err"},{"line_number":329,"context_line":"\t\t\t// This should not happen."}],"source_content_type":"text/x-go","patch_set":5,"id":"d3fae982_86f040b6","line":326,"range":{"start_line":326,"start_character":2,"end_line":326,"end_character":39},"updated":"2022-03-22 12:12:19.000000000","message":"Please add a TODO(mhz) to ensure that if the node join key index already exists, it points to the node we\u0027re saving (to ensure we don\u0027t have two nodes competing for the same join key). This will require refactoring l.txnAsLeader to take additional transaction conditions, probably.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"6a042f4642dbbae98905ed9c89996b4f73e0e866","unresolved":true,"context_lines":[{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"},{"line_number":328,"context_line":"\t\t\t// TODO(issues/85): log err"},{"line_number":329,"context_line":"\t\t\t// This should not happen."}],"source_content_type":"text/x-go","patch_set":5,"id":"b5d0915e_40a92884","line":326,"range":{"start_line":326,"start_character":2,"end_line":326,"end_character":39},"in_reply_to":"45ba2a1a_3a791eb1","updated":"2022-03-29 10:04:48.000000000","message":"Refuse to save/update the node.","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"c54c3ebeaba0d631f0a27d1539810e3550812736","unresolved":false,"context_lines":[{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"},{"line_number":328,"context_line":"\t\t\t// TODO(issues/85): log err"},{"line_number":329,"context_line":"\t\t\t// This should not happen."}],"source_content_type":"text/x-go","patch_set":5,"id":"db45aaa1_4ef49e90","line":326,"range":{"start_line":326,"start_character":2,"end_line":326,"end_character":39},"in_reply_to":"b5d0915e_40a92884","updated":"2022-04-08 17:38:03.000000000","message":"Done","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":true,"context_lines":[{"line_number":323,"context_line":"\t// Join Flow. Do it only if the node\u0027s Join Key is set."},{"line_number":324,"context_line":"\tif len(n.jkey) !\u003d 0 {"},{"line_number":325,"context_line":"\t\tcred :\u003d hex.EncodeToString(n.jkey)"},{"line_number":326,"context_line":"\t\tjkey, err :\u003d joinCredPrefix.Key(cred)"},{"line_number":327,"context_line":"\t\tif err !\u003d nil {"},{"line_number":328,"context_line":"\t\t\t// TODO(issues/85): log err"},{"line_number":329,"context_line":"\t\t\t// This should not happen."}],"source_content_type":"text/x-go","patch_set":5,"id":"45ba2a1a_3a791eb1","line":326,"range":{"start_line":326,"start_character":2,"end_line":326,"end_character":39},"in_reply_to":"d3fae982_86f040b6","updated":"2022-03-26 11:22:29.000000000","message":"OK. What action should be taken if it already exists, though?","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":351,"context_line":"// gRPC statuses that are safe to return to untrusted callers. If the given"},{"line_number":352,"context_line":"// Join Key is not found, errNodeNotFound will be returned along with an empty"},{"line_number":353,"context_line":"// string."},{"line_number":354,"context_line":"func resolveNodeId(ctx context.Context, l *leadership, jkey []byte) (string, error) {"},{"line_number":355,"context_line":"\tif len(jkey) \u003d\u003d 0 {"},{"line_number":356,"context_line":"\t\treturn \"\", status.Errorf(codes.InvalidArgument, \"join key is empty\")"},{"line_number":357,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"6f7ff6bd_37620418","line":354,"range":{"start_line":354,"start_character":5,"end_line":354,"end_character":18},"updated":"2022-03-22 12:12:19.000000000","message":"nodeIdByJoinKey","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":false,"context_lines":[{"line_number":351,"context_line":"// gRPC statuses that are safe to return to untrusted callers. If the given"},{"line_number":352,"context_line":"// Join Key is not found, errNodeNotFound will be returned along with an empty"},{"line_number":353,"context_line":"// string."},{"line_number":354,"context_line":"func resolveNodeId(ctx context.Context, l *leadership, jkey []byte) (string, error) {"},{"line_number":355,"context_line":"\tif len(jkey) \u003d\u003d 0 {"},{"line_number":356,"context_line":"\t\treturn \"\", status.Errorf(codes.InvalidArgument, \"join key is empty\")"},{"line_number":357,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":5,"id":"b412ce7c_4af1e248","line":354,"range":{"start_line":354,"start_character":5,"end_line":354,"end_character":18},"in_reply_to":"6f7ff6bd_37620418","updated":"2022-03-26 11:22:29.000000000","message":"Done","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"}],"metropolis/node/core/roleserve/worker_controlplane.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":"036d8926bb83fe2e8379aca4b905edd0d0bb0d2c","unresolved":true,"context_lines":[{"line_number":369,"context_line":""},{"line_number":370,"context_line":"\t\t\t// Save this node\u0027s credentials, cluster directory and configuration as"},{"line_number":371,"context_line":"\t\t\t// part of the control plane bootstrap process."},{"line_number":372,"context_line":"\t\t\tif b :\u003d startup.bootstrap; b !\u003d nil \u0026\u0026 caCert !\u003d nil {"},{"line_number":373,"context_line":"\t\t\t\tif err \u003d creds.Save(\u0026s.storageRoot.Data.Node.Credentials); err !\u003d nil {"},{"line_number":374,"context_line":"\t\t\t\t\treturn fmt.Errorf(\"while saving node credentials: %w\", err)"},{"line_number":375,"context_line":"\t\t\t\t}"}],"source_content_type":"text/x-go","patch_set":12,"id":"3ea5c922_01b0cf1d","line":372,"range":{"start_line":372,"start_character":3,"end_line":372,"end_character":57},"updated":"2022-04-19 11:48:14.000000000","message":"Why not roll this up into the if {} above?","commit_id":"72d9113fe3f96da55d00f34c73d93b7e4dc62c38"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"e6d83276b5a69134f8cb5b49f8f04ea8fbe14bdb","unresolved":true,"context_lines":[{"line_number":369,"context_line":""},{"line_number":370,"context_line":"\t\t\t// Save this node\u0027s credentials, cluster directory and configuration as"},{"line_number":371,"context_line":"\t\t\t// part of the control plane bootstrap process."},{"line_number":372,"context_line":"\t\t\tif b :\u003d startup.bootstrap; b !\u003d nil \u0026\u0026 caCert !\u003d nil {"},{"line_number":373,"context_line":"\t\t\t\tif err \u003d creds.Save(\u0026s.storageRoot.Data.Node.Credentials); err !\u003d nil {"},{"line_number":374,"context_line":"\t\t\t\t\treturn fmt.Errorf(\"while saving node credentials: %w\", err)"},{"line_number":375,"context_line":"\t\t\t\t}"}],"source_content_type":"text/x-go","patch_set":12,"id":"cadf55fd_28323714","line":372,"range":{"start_line":372,"start_character":3,"end_line":372,"end_character":57},"in_reply_to":"3ea5c922_01b0cf1d","updated":"2022-04-22 16:53:56.000000000","message":"I need the \"directory\" variable here, defined above this block and still used after it.","commit_id":"72d9113fe3f96da55d00f34c73d93b7e4dc62c38"},{"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":"91347063de003f866033d2896942a9bbc11bc23f","unresolved":false,"context_lines":[{"line_number":369,"context_line":""},{"line_number":370,"context_line":"\t\t\t// Save this node\u0027s credentials, cluster directory and configuration as"},{"line_number":371,"context_line":"\t\t\t// part of the control plane bootstrap process."},{"line_number":372,"context_line":"\t\t\tif b :\u003d startup.bootstrap; b !\u003d nil \u0026\u0026 caCert !\u003d nil {"},{"line_number":373,"context_line":"\t\t\t\tif err \u003d creds.Save(\u0026s.storageRoot.Data.Node.Credentials); err !\u003d nil {"},{"line_number":374,"context_line":"\t\t\t\t\treturn fmt.Errorf(\"while saving node credentials: %w\", err)"},{"line_number":375,"context_line":"\t\t\t\t}"}],"source_content_type":"text/x-go","patch_set":12,"id":"90ed7087_65ae4116","line":372,"range":{"start_line":372,"start_character":3,"end_line":372,"end_character":57},"in_reply_to":"cadf55fd_28323714","updated":"2022-04-27 13:10:06.000000000","message":"Ack","commit_id":"72d9113fe3f96da55d00f34c73d93b7e4dc62c38"}],"metropolis/proto/common/common.proto":[{"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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":true,"context_lines":[{"line_number":133,"context_line":"    // Kubernetes)."},{"line_number":134,"context_line":"    string external_address \u003d 1;"},{"line_number":135,"context_line":"    // timestamp is an epoch number associated with the last status update."},{"line_number":136,"context_line":"    // It\u0027s set by Curator with a millisecond granularity."},{"line_number":137,"context_line":"    int64 timestamp \u003d 2;"},{"line_number":138,"context_line":"}"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":5,"id":"77add9e3_d2a495a4","line":136,"range":{"start_line":136,"start_character":34,"end_line":136,"end_character":45},"updated":"2022-03-22 12:12:19.000000000","message":"We use nanoseconds from epoch [1] elsewhere in Monogon, let\u0027s use them here, too.\n\n[1] With an int63, that gives us timestamps until 2262 CE","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"ee4fe643895daa1a6a267d0f80e1f341da6b70d6","unresolved":false,"context_lines":[{"line_number":133,"context_line":"    // Kubernetes)."},{"line_number":134,"context_line":"    string external_address \u003d 1;"},{"line_number":135,"context_line":"    // timestamp is an epoch number associated with the last status update."},{"line_number":136,"context_line":"    // It\u0027s set by Curator with a millisecond granularity."},{"line_number":137,"context_line":"    int64 timestamp \u003d 2;"},{"line_number":138,"context_line":"}"},{"line_number":139,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":5,"id":"893eebb5_7c9c8f23","line":136,"range":{"start_line":136,"start_character":34,"end_line":136,"end_character":45},"in_reply_to":"77add9e3_d2a495a4","updated":"2022-03-26 11:22:29.000000000","message":"Done","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"}],"metropolis/test/launch/cluster/cluster.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":"f2a52cdd563561c3106d1b075239d20febc83c64","unresolved":false,"context_lines":[{"line_number":72,"context_line":"}"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"// Runtime keeps the node\u0027s QEMU runtime options."},{"line_number":75,"context_line":"type NodeRuntime struct {"},{"line_number":76,"context_line":"\t// ld points at the node\u0027s launch directory storing data such as storage"},{"line_number":77,"context_line":"\t// images, firmware variables or the TPM state."},{"line_number":78,"context_line":"\tld string"}],"source_content_type":"text/x-go","patch_set":5,"id":"aa0814e8_c86e49fe","line":75,"range":{"start_line":75,"start_character":5,"end_line":75,"end_character":16},"updated":"2022-03-22 12:12:19.000000000","message":"All of the launch changes could\u0027ve and probably should\u0027ve gone into a separate CR for easier review. But it\u0027s okay this time, especially since that part LGTM :).","commit_id":"6d2af7dc2493cb06a9df65ac05d0c47ec02ff863"},{"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":"036d8926bb83fe2e8379aca4b905edd0d0bb0d2c","unresolved":true,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"// curatorClient returns an authenticated owner connection to a Curator"},{"line_number":172,"context_line":"// instance within Cluster c, or nil together with an error."},{"line_number":173,"context_line":"func (c *Cluster) curatorClient() (*grpc.ClientConn, error) {"},{"line_number":174,"context_line":"\tauthCreds :\u003d rpc.NewAuthenticatedCredentials(c.Owner, nil)"},{"line_number":175,"context_line":"\tremote :\u003d net.JoinHostPort(c.NodeIDs[0], common.CuratorServicePort.PortString())"},{"line_number":176,"context_line":"\tauthClient, err :\u003d grpc.Dial(remote, grpc.WithTransportCredentials(authCreds), grpc.WithContextDialer(c.DialNode))"}],"source_content_type":"text/x-go","patch_set":12,"id":"ebdfc52a_8c2f0ee8","line":173,"updated":"2022-04-19 11:48:14.000000000","message":"We should probably instead just keep an open connection to the cluster (with the appropriate options, and in the future with client load balancing) as part of the Cluster structure - and even keep client stubs. There should be no need to re-dial every time we want to do something with the cluster.","commit_id":"72d9113fe3f96da55d00f34c73d93b7e4dc62c38"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"e6d83276b5a69134f8cb5b49f8f04ea8fbe14bdb","unresolved":false,"context_lines":[{"line_number":170,"context_line":""},{"line_number":171,"context_line":"// curatorClient returns an authenticated owner connection to a Curator"},{"line_number":172,"context_line":"// instance within Cluster c, or nil together with an error."},{"line_number":173,"context_line":"func (c *Cluster) curatorClient() (*grpc.ClientConn, error) {"},{"line_number":174,"context_line":"\tauthCreds :\u003d rpc.NewAuthenticatedCredentials(c.Owner, nil)"},{"line_number":175,"context_line":"\tremote :\u003d net.JoinHostPort(c.NodeIDs[0], common.CuratorServicePort.PortString())"},{"line_number":176,"context_line":"\tauthClient, err :\u003d grpc.Dial(remote, grpc.WithTransportCredentials(authCreds), grpc.WithContextDialer(c.DialNode))"}],"source_content_type":"text/x-go","patch_set":12,"id":"489502f7_f186d42b","line":173,"in_reply_to":"ebdfc52a_8c2f0ee8","updated":"2022-04-22 16:53:56.000000000","message":"Done","commit_id":"72d9113fe3f96da55d00f34c73d93b7e4dc62c38"}]}
