)]}'
{"/PATCHSET_LEVEL":[{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"070e0e64_884d0888","updated":"2021-06-08 14:28:17.000000000","message":"I\u0027m very sorry about the number of comments, but fortunately the vast majority of them are nits about comment style or underdocumented fields.\n\nThere\u0027s also a few small questions about semantics that I didn\u0027t realize were an issue when in the design doc, and I feel they are mostly leftovers from previous implementations.\n\nI also couldn\u0027t stop myself but write down a fancy way of expressing the migration protocols, sorry :).","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"0fbf2cf1fe807971c1a9d52716ea5c167f47d9b1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":1,"id":"a0e8a6bc_b2316729","updated":"2021-06-08 14:29:33.000000000","message":"Oh, also, you need to rebase this to a newer point in master to get the CI to run :).","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"76c70de6_4d069d40","updated":"2021-06-16 12:49:52.000000000","message":"Adressed most comments","commit_id":"d845c32205655cc29fe00d44543558c021f34a95"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"55b4ff7f_ec777b8b","updated":"2021-06-16 16:18:36.000000000","message":"Missed some comments to be marked done.","commit_id":"d845c32205655cc29fe00d44543558c021f34a95"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7b4023b22e03b002b222f6f3339d2193ec9fcc4c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":5,"id":"a5ee8e35_86aedb90","updated":"2021-06-16 18:45:47.000000000","message":"This should finally address all comments.","commit_id":"d845c32205655cc29fe00d44543558c021f34a95"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":8,"id":"f8574f1c_9de30d3d","updated":"2021-06-17 09:29:30.000000000","message":"Overall good changes. Almost there.\n\nWhat\u0027s left:\n - two (or three) YAGNI discussions\n - comment and style nits\n - some further clarifications","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":9,"id":"6a71aaff_f0cd7ff9","updated":"2021-06-21 11:18:53.000000000","message":"Clarified comments","commit_id":"9a69a16dbcf91d3878c83f9ca3af9be9392d8775"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"29387f9966d6092f23d729a7c3bb1f519cb739f1","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":10,"id":"ca04301a_7c3b927e","updated":"2021-06-21 14:18:30.000000000","message":"Proper comment for LeaseMode","commit_id":"00d749aa50574c0b29655fe16d7eff8499144688"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"49fa12cb0a09ef3d3718bfc317d62df1d00c082c","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"6d36d61a_0095e609","updated":"2021-06-22 12:04:07.000000000","message":"Closed out comment","commit_id":"b6f9cc29f82712707ace587c9d6cfdd0c0564769"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"605a512565cb5e7a8efb077341238f662ed77179","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":12,"id":"1372dbf1_64cd3430","updated":"2021-06-22 11:00:53.000000000","message":"Left a comment that a maximum of one IP per IP protocol version is supported.","commit_id":"b6f9cc29f82712707ace587c9d6cfdd0c0564769"}],"metropolis/vm/proto/vm.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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":1,"context_line":"syntax \u003d \"proto3\";"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b72d4a98_f0b5b29e","line":2,"updated":"2021-06-08 14:28:17.000000000","message":"nit: Please reflow the comments to 80 or 100 characters. 100 seems to be the Gerrit limit, 80 would be consistent with our Go codebase.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":1,"context_line":"syntax \u003d \"proto3\";"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"8b6100fa_d03403b3","line":2,"in_reply_to":"b72d4a98_f0b5b29e","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":1,"context_line":"syntax \u003d \"proto3\";"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"07d50a3a_631f8181","line":3,"range":{"start_line":3,"start_character":19,"end_line":3,"end_character":21},"updated":"2021-06-08 14:28:17.000000000","message":"This should be metropolis.vm.proto to keep this consistent with existing protofiles (every directory path element is a package path element).","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":true,"context_lines":[{"line_number":1,"context_line":"syntax \u003d \"proto3\";"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"74ade3d2_93867c25","line":3,"range":{"start_line":3,"start_character":19,"end_line":3,"end_character":21},"in_reply_to":"07d50a3a_631f8181","updated":"2021-06-16 12:49:52.000000000","message":"Having a proto in the package path looks IMO kind of ugly. Another option would be moving the protos into //metropolis/vm:vm.proto but Go wants its own directory per package, so the imports would still need to reference metropolis/vm/proto.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":1,"context_line":"syntax \u003d \"proto3\";"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b1428d25_b420c042","line":3,"range":{"start_line":3,"start_character":19,"end_line":3,"end_character":21},"in_reply_to":"2842f97f_0df6219b","updated":"2021-06-21 11:18:53.000000000","message":"Sounds reasonable.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":1,"context_line":"syntax \u003d \"proto3\";"},{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"2842f97f_0df6219b","line":3,"range":{"start_line":3,"start_character":19,"end_line":3,"end_character":21},"in_reply_to":"74ade3d2_93867c25","updated":"2021-06-17 09:29:30.000000000","message":"Right, but that is not consistent with the existing codebase. I\u0027m not a fan of the effective \u0027proto\u0027 path parts, but I\u0027d rather keep it consistent for now and refactor it in a followup change across the entire codebase.\n\nJust like our proto enum default/zero values should probably be UNDEFINED and not UNKNOWN, but I\u0027m not going to start using that before doing a sweeping change :).","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b0d175db_ce87319a","line":5,"range":{"start_line":5,"start_character":79,"end_line":5,"end_character":87},"updated":"2021-06-08 14:28:17.000000000","message":"nit: Comments should be full sentences that end with period.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"c9460acb_ff63535f","line":5,"range":{"start_line":5,"start_character":3,"end_line":5,"end_character":9},"updated":"2021-06-08 14:28:17.000000000","message":"nit: `VMSpec fully defines all information about a VM and is consumed by the VM hypervisor through a runtime environment variable.`\n\nie., the comment should describe the purpose of this message when it\u0027s not just a gRPC *Request/*Response message.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"74838909_5d14815a","line":5,"range":{"start_line":5,"start_character":79,"end_line":5,"end_character":87},"in_reply_to":"b0d175db_ce87319a","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":2,"context_line":""},{"line_number":3,"context_line":"package metropolis.vm;"},{"line_number":4,"context_line":""},{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"bf49f7d6_8d3ddf3a","line":5,"range":{"start_line":5,"start_character":3,"end_line":5,"end_character":9},"in_reply_to":"c9460acb_ff63535f","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":9,"context_line":"    RUN \u003d 1; // Normal VM start"},{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"cbbfbf6f_ed8c8fa0","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":11},"updated":"2021-06-08 14:28:17.000000000","message":"Prefix enums with START_MODE_ or SM_ to avoid collision with future enums in this scope.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":5,"context_line":"// VMSpec is passed by the controller to the VM hypervisor over an environment variable"},{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":9,"context_line":"    RUN \u003d 1; // Normal VM start"},{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"03fbd27a_bb1fac82","line":8,"range":{"start_line":8,"start_character":4,"end_line":8,"end_character":11},"in_reply_to":"cbbfbf6f_ed8c8fa0","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":9,"context_line":"    RUN \u003d 1; // Normal VM start"},{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"},{"line_number":12,"context_line":"  }"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"97ce3d8e_a92fb372","line":9,"range":{"start_line":9,"start_character":13,"end_line":9,"end_character":31},"updated":"2021-06-08 14:28:17.000000000","message":"nit: Comments should be on separate lines.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":6,"context_line":"message VMSpec {"},{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":9,"context_line":"    RUN \u003d 1; // Normal VM start"},{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"},{"line_number":12,"context_line":"  }"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"952c47ce_78cc4086","line":9,"range":{"start_line":9,"start_character":13,"end_line":9,"end_character":31},"in_reply_to":"97ce3d8e_a92fb372","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":9,"context_line":"    RUN \u003d 1; // Normal VM start"},{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"},{"line_number":12,"context_line":"  }"},{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"3d5ce370_233b636e","line":10,"range":{"start_line":10,"start_character":26,"end_line":10,"end_character":59},"updated":"2021-06-08 14:28:17.000000000","message":"Is the VM run after the disk is initialized?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":7,"context_line":"  enum StartMode {"},{"line_number":8,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":9,"context_line":"    RUN \u003d 1; // Normal VM start"},{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"},{"line_number":12,"context_line":"  }"},{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"75c1a06b_69056254","line":10,"range":{"start_line":10,"start_character":26,"end_line":10,"end_character":59},"in_reply_to":"3d5ce370_233b636e","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"},{"line_number":12,"context_line":"  }"},{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"},{"line_number":14,"context_line":"  string namespace \u003d 7; // Namespace of VM object"},{"line_number":15,"context_line":"  StartMode mode \u003d 2;"},{"line_number":16,"context_line":"  InitialImage initial_image \u003d 3;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"3cf1a682_36932ef8","line":13,"range":{"start_line":13,"start_character":35,"end_line":13,"end_character":41},"updated":"2021-06-08 14:28:17.000000000","message":"nit: `Name field from Kubernetes VirtualMachine object.`\n\n(next comments within eyereach can shorten this to \u0027VM object\u0027, but this should recontextualize precisely what object we\u0027re talking about)","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":10,"context_line":"    PREPARE_IMAGE \u003d 2; // Initialize the disk of the new VM"},{"line_number":11,"context_line":"    INCOMING_MIGRATION \u003d 3; // Wait for an incoming migration"},{"line_number":12,"context_line":"  }"},{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"},{"line_number":14,"context_line":"  string namespace \u003d 7; // Namespace of VM object"},{"line_number":15,"context_line":"  StartMode mode \u003d 2;"},{"line_number":16,"context_line":"  InitialImage initial_image \u003d 3;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"f12b2d7a_f166b571","line":13,"range":{"start_line":13,"start_character":35,"end_line":13,"end_character":41},"in_reply_to":"3cf1a682_36932ef8","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":12,"context_line":"  }"},{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"},{"line_number":14,"context_line":"  string namespace \u003d 7; // Namespace of VM object"},{"line_number":15,"context_line":"  StartMode mode \u003d 2;"},{"line_number":16,"context_line":"  InitialImage initial_image \u003d 3;"},{"line_number":17,"context_line":"  repeated IPNet address \u003d 4; // From vmIPs in the spec"},{"line_number":18,"context_line":"  string controller_endpoint \u003d 6; // gRPC endpoint of the controller for this VM"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"61926ffa_100f02d8","line":15,"updated":"2021-06-08 14:28:17.000000000","message":"nit: keep this next to the enum definition.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":12,"context_line":"  }"},{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"},{"line_number":14,"context_line":"  string namespace \u003d 7; // Namespace of VM object"},{"line_number":15,"context_line":"  StartMode mode \u003d 2;"},{"line_number":16,"context_line":"  InitialImage initial_image \u003d 3;"},{"line_number":17,"context_line":"  repeated IPNet address \u003d 4; // From vmIPs in the spec"},{"line_number":18,"context_line":"  string controller_endpoint \u003d 6; // gRPC endpoint of the controller for this VM"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"79fdf46a_699b43d3","line":15,"in_reply_to":"61926ffa_100f02d8","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"},{"line_number":14,"context_line":"  string namespace \u003d 7; // Namespace of VM object"},{"line_number":15,"context_line":"  StartMode mode \u003d 2;"},{"line_number":16,"context_line":"  InitialImage initial_image \u003d 3;"},{"line_number":17,"context_line":"  repeated IPNet address \u003d 4; // From vmIPs in the spec"},{"line_number":18,"context_line":"  string controller_endpoint \u003d 6; // gRPC endpoint of the controller for this VM"},{"line_number":19,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"23ad2cc5_99091afb","line":16,"range":{"start_line":16,"start_character":15,"end_line":16,"end_character":28},"updated":"2021-06-08 14:28:17.000000000","message":"Needs comment, eg. what is this used for, is this set only for when mode \u003d\u003d PREPARE_IMAGE?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":13,"context_line":"  string name \u003d 1; // VM name from object"},{"line_number":14,"context_line":"  string namespace \u003d 7; // Namespace of VM object"},{"line_number":15,"context_line":"  StartMode mode \u003d 2;"},{"line_number":16,"context_line":"  InitialImage initial_image \u003d 3;"},{"line_number":17,"context_line":"  repeated IPNet address \u003d 4; // From vmIPs in the spec"},{"line_number":18,"context_line":"  string controller_endpoint \u003d 6; // gRPC endpoint of the controller for this VM"},{"line_number":19,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"43ceaaa3_02561c86","line":16,"range":{"start_line":16,"start_character":15,"end_line":16,"end_character":28},"in_reply_to":"23ad2cc5_99091afb","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"// InitialImage represents a source from which a new VM root block device can be instantiated."},{"line_number":22,"context_line":"message InitialImage {"},{"line_number":23,"context_line":"  string url \u003d 3; // From initialImage.url in the spec"},{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"c3323247_bcc4e20e","line":23,"range":{"start_line":23,"start_character":15,"end_line":23,"end_character":16},"updated":"2021-06-08 14:28:17.000000000","message":"nit: Start with tag at 1. Also others: rearrange the tags (eg. VMSpec.namespace is at 7)? We haven\u0027t published the wire spec yet, so we might as well keep things clean.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":20,"context_line":""},{"line_number":21,"context_line":"// InitialImage represents a source from which a new VM root block device can be instantiated."},{"line_number":22,"context_line":"message InitialImage {"},{"line_number":23,"context_line":"  string url \u003d 3; // From initialImage.url in the spec"},{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b05bf8de_d0aaebb3","line":23,"range":{"start_line":23,"start_character":15,"end_line":23,"end_character":16},"in_reply_to":"c3323247_bcc4e20e","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":23,"context_line":"  string url \u003d 3; // From initialImage.url in the spec"},{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"},{"line_number":27,"context_line":"// Exposed as vm.metropolis.monogon.dev/v1/metadata.pb and vm.metropolis.monogon.dev/v1/metadata.json"},{"line_number":28,"context_line":"message VMMetadata {"},{"line_number":29,"context_line":"  string name \u003d 1; // Name of the VM as specified by the name field of the VM object"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"47038382_86e6e7a3","line":26,"range":{"start_line":26,"start_character":94,"end_line":26,"end_character":102},"updated":"2021-06-08 14:28:17.000000000","message":"Truncated comment.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":23,"context_line":"  string url \u003d 3; // From initialImage.url in the spec"},{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"},{"line_number":27,"context_line":"// Exposed as vm.metropolis.monogon.dev/v1/metadata.pb and vm.metropolis.monogon.dev/v1/metadata.json"},{"line_number":28,"context_line":"message VMMetadata {"},{"line_number":29,"context_line":"  string name \u003d 1; // Name of the VM as specified by the name field of the VM object"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"573fac37_0620db4d","line":26,"range":{"start_line":26,"start_character":94,"end_line":26,"end_character":102},"in_reply_to":"47038382_86e6e7a3","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"},{"line_number":27,"context_line":"// Exposed as vm.metropolis.monogon.dev/v1/metadata.pb and vm.metropolis.monogon.dev/v1/metadata.json"},{"line_number":28,"context_line":"message VMMetadata {"},{"line_number":29,"context_line":"  string name \u003d 1; // Name of the VM as specified by the name field of the VM object"},{"line_number":30,"context_line":"  NetworkConfig network_config \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"6729379d_415e7c0c","line":27,"range":{"start_line":27,"start_character":3,"end_line":27,"end_character":101},"updated":"2021-06-08 14:28:17.000000000","message":"Are we using both already? Let\u0027s keep it simple for now if possible.\n\nnit: I assume this will be exposed as a raw serialized proto - not prototext, not b64encoded, etc. This should be explicitly stated, too.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":true,"context_lines":[{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"},{"line_number":27,"context_line":"// Exposed as vm.metropolis.monogon.dev/v1/metadata.pb and vm.metropolis.monogon.dev/v1/metadata.json"},{"line_number":28,"context_line":"message VMMetadata {"},{"line_number":29,"context_line":"  string name \u003d 1; // Name of the VM as specified by the name field of the VM object"},{"line_number":30,"context_line":"  NetworkConfig network_config \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"e1ee4508_3beabb6f","line":27,"range":{"start_line":27,"start_character":3,"end_line":27,"end_character":101},"in_reply_to":"6729379d_415e7c0c","updated":"2021-06-16 12:49:52.000000000","message":"The idea was that full-blown agents/automation (like our customer\u0027s or our own) would use the wire format proto representation and that the JSON representation is just for some quick cat\u0027ing or a hacked-together script with jq. Considering that this might be exposed to various systems and protojson is very easy to encode I\u0027d provide both from the start.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"},{"line_number":27,"context_line":"// Exposed as vm.metropolis.monogon.dev/v1/metadata.pb and vm.metropolis.monogon.dev/v1/metadata.json"},{"line_number":28,"context_line":"message VMMetadata {"},{"line_number":29,"context_line":"  string name \u003d 1; // Name of the VM as specified by the name field of the VM object"},{"line_number":30,"context_line":"  NetworkConfig network_config \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b67a8fe3_44feff34","line":27,"range":{"start_line":27,"start_character":3,"end_line":27,"end_character":101},"in_reply_to":"b38eda32_e6e7c42d","updated":"2021-06-21 11:18:53.000000000","message":"Ack","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":24,"context_line":"}"},{"line_number":25,"context_line":""},{"line_number":26,"context_line":"// This is a structure exposing VM metadata to the VM via fw_cfg interface. It currently only contains"},{"line_number":27,"context_line":"// Exposed as vm.metropolis.monogon.dev/v1/metadata.pb and vm.metropolis.monogon.dev/v1/metadata.json"},{"line_number":28,"context_line":"message VMMetadata {"},{"line_number":29,"context_line":"  string name \u003d 1; // Name of the VM as specified by the name field of the VM object"},{"line_number":30,"context_line":"  NetworkConfig network_config \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b38eda32_e6e7c42d","line":27,"range":{"start_line":27,"start_character":3,"end_line":27,"end_character":101},"in_reply_to":"e1ee4508_3beabb6f","updated":"2021-06-17 09:29:30.000000000","message":"Right, but we don\u0027t need it right now, and we are committing to an API accidentally here. I would lean towards YAGNI (or at least a follow up CR), but I\u0027m willing to concede.\n\nhttps://google.github.io/eng-practices/review/reviewer/looking-for.html#complexity","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":30,"context_line":"  NetworkConfig network_config \u003d 2;"},{"line_number":31,"context_line":"}"},{"line_number":32,"context_line":"message IPNet {"},{"line_number":33,"context_line":"  bytes ip \u003d 1; // IP address of the VM"},{"line_number":34,"context_line":"  bytes mask \u003d 2; // Netmask for said IP (usually /32 or /64)"},{"line_number":35,"context_line":"  bytes peer_ip \u003d 3; // PtP gateway for the default route"},{"line_number":36,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"d18befa8_38dbbf6a","line":33,"range":{"start_line":33,"start_character":2,"end_line":33,"end_character":7},"updated":"2021-06-08 14:28:17.000000000","message":"Using bytes here needs to be at least documented (what\u0027s the format, what\u0027s the guarantees).\n\nMaybe we should just use a string in CIDR notation? It\u0027s not much more to parse / sanitize and it\u0027s much more usable for humans.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":30,"context_line":"  NetworkConfig network_config \u003d 2;"},{"line_number":31,"context_line":"}"},{"line_number":32,"context_line":"message IPNet {"},{"line_number":33,"context_line":"  bytes ip \u003d 1; // IP address of the VM"},{"line_number":34,"context_line":"  bytes mask \u003d 2; // Netmask for said IP (usually /32 or /64)"},{"line_number":35,"context_line":"  bytes peer_ip \u003d 3; // PtP gateway for the default route"},{"line_number":36,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"35175b6d_583568f0","line":33,"range":{"start_line":33,"start_character":2,"end_line":33,"end_character":7},"in_reply_to":"d18befa8_38dbbf6a","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":32,"context_line":"message IPNet {"},{"line_number":33,"context_line":"  bytes ip \u003d 1; // IP address of the VM"},{"line_number":34,"context_line":"  bytes mask \u003d 2; // Netmask for said IP (usually /32 or /64)"},{"line_number":35,"context_line":"  bytes peer_ip \u003d 3; // PtP gateway for the default route"},{"line_number":36,"context_line":"}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"message NetworkConfig {"},{"line_number":39,"context_line":"  repeated IPNet address \u003d 1; // Currently a maximum of 2 addresses are supported, one for IPv4 and one for IPv6"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"2505447c_c7ba2e15","line":36,"range":{"start_line":35,"start_character":21,"end_line":36,"end_character":1},"updated":"2021-06-08 14:28:17.000000000","message":"This implies a certain network topology, which needs to be documented (eg. as part of an IPNet docstring).","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":32,"context_line":"message IPNet {"},{"line_number":33,"context_line":"  bytes ip \u003d 1; // IP address of the VM"},{"line_number":34,"context_line":"  bytes mask \u003d 2; // Netmask for said IP (usually /32 or /64)"},{"line_number":35,"context_line":"  bytes peer_ip \u003d 3; // PtP gateway for the default route"},{"line_number":36,"context_line":"}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"message NetworkConfig {"},{"line_number":39,"context_line":"  repeated IPNet address \u003d 1; // Currently a maximum of 2 addresses are supported, one for IPv4 and one for IPv6"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"319a525b_738880a9","line":36,"range":{"start_line":35,"start_character":21,"end_line":36,"end_character":1},"in_reply_to":"2505447c_c7ba2e15","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":35,"context_line":"  bytes peer_ip \u003d 3; // PtP gateway for the default route"},{"line_number":36,"context_line":"}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"message NetworkConfig {"},{"line_number":39,"context_line":"  repeated IPNet address \u003d 1; // Currently a maximum of 2 addresses are supported, one for IPv4 and one for IPv6"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"f0ac4567_19c0185e","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":21},"updated":"2021-06-08 14:28:17.000000000","message":"This message doesn\u0027t seem to be used anywhere else. Should we collapse `repeated IPNet address` into VMMetadata?\n\nnit: If we keep it separate, NetworkConfig is somewhat generic and it might also mean different things to different parts of the system: eg. the hypervisor might need different data than the VM itself. So this then should be then either named something like `VMGuestNetworkConfig` or moved into the VMMetadata scope.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":false,"context_lines":[{"line_number":35,"context_line":"  bytes peer_ip \u003d 3; // PtP gateway for the default route"},{"line_number":36,"context_line":"}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"message NetworkConfig {"},{"line_number":39,"context_line":"  repeated IPNet address \u003d 1; // Currently a maximum of 2 addresses are supported, one for IPv4 and one for IPv6"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"ad77cb90_395043d0","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":21},"in_reply_to":"e881269b_260675a8","updated":"2021-06-17 09:29:30.000000000","message":"Ack","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7b4023b22e03b002b222f6f3339d2193ec9fcc4c","unresolved":true,"context_lines":[{"line_number":35,"context_line":"  bytes peer_ip \u003d 3; // PtP gateway for the default route"},{"line_number":36,"context_line":"}"},{"line_number":37,"context_line":""},{"line_number":38,"context_line":"message NetworkConfig {"},{"line_number":39,"context_line":"  repeated IPNet address \u003d 1; // Currently a maximum of 2 addresses are supported, one for IPv4 and one for IPv6"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"e881269b_260675a8","line":38,"range":{"start_line":38,"start_character":8,"end_line":38,"end_character":21},"in_reply_to":"f0ac4567_19c0185e","updated":"2021-06-16 18:45:47.000000000","message":"The thing is this config is not just for the VM, but also for the hypervisor. So I\u0027m somewhat reluctant to call it VMGuestNetworkConfig. I thought about doing a oneof inside VMMetadata and collapse into that, but AFAIK proto3 doesn\u0027t do repeated fields in oneofs, so that wouldn\u0027t work either.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":39,"context_line":"  repeated IPNet address \u003d 1; // Currently a maximum of 2 addresses are supported, one for IPv4 and one for IPv6"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"// The VMController service is exposed by the controller for the hypervisors to interact"},{"line_number":43,"context_line":"service VMController {"},{"line_number":44,"context_line":"  rpc CreateMigrationTarget(CreateMigrationTargetRequest) returns (CreateMigrationTargetResponse);"},{"line_number":45,"context_line":"  rpc MigrationSwitchover(MigrationSwitchoverRequest) returns (MigrationSwitchoverResponse);"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"984d44b0_a7ce39d2","line":42,"range":{"start_line":42,"start_character":80,"end_line":42,"end_character":88},"updated":"2021-06-08 14:28:17.000000000","message":"nit: ... interact with?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":39,"context_line":"  repeated IPNet address \u003d 1; // Currently a maximum of 2 addresses are supported, one for IPv4 and one for IPv6"},{"line_number":40,"context_line":"}"},{"line_number":41,"context_line":""},{"line_number":42,"context_line":"// The VMController service is exposed by the controller for the hypervisors to interact"},{"line_number":43,"context_line":"service VMController {"},{"line_number":44,"context_line":"  rpc CreateMigrationTarget(CreateMigrationTargetRequest) returns (CreateMigrationTargetResponse);"},{"line_number":45,"context_line":"  rpc MigrationSwitchover(MigrationSwitchoverRequest) returns (MigrationSwitchoverResponse);"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b9f92f6f_fbb02b1a","line":42,"range":{"start_line":42,"start_character":80,"end_line":42,"end_character":88},"in_reply_to":"984d44b0_a7ce39d2","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"// The VMController service is exposed by the controller for the hypervisors to interact"},{"line_number":43,"context_line":"service VMController {"},{"line_number":44,"context_line":"  rpc CreateMigrationTarget(CreateMigrationTargetRequest) returns (CreateMigrationTargetResponse);"},{"line_number":45,"context_line":"  rpc MigrationSwitchover(MigrationSwitchoverRequest) returns (MigrationSwitchoverResponse);"},{"line_number":46,"context_line":"  rpc RunLease(RunLeaseRequest) returns (stream RunLeaseUpdate);"},{"line_number":47,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"bd5c9cec_b9116601","line":44,"range":{"start_line":44,"start_character":6,"end_line":44,"end_character":27},"updated":"2021-06-08 14:28:17.000000000","message":"nit: Needs docstring (the two other rpcs too).","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":41,"context_line":""},{"line_number":42,"context_line":"// The VMController service is exposed by the controller for the hypervisors to interact"},{"line_number":43,"context_line":"service VMController {"},{"line_number":44,"context_line":"  rpc CreateMigrationTarget(CreateMigrationTargetRequest) returns (CreateMigrationTargetResponse);"},{"line_number":45,"context_line":"  rpc MigrationSwitchover(MigrationSwitchoverRequest) returns (MigrationSwitchoverResponse);"},{"line_number":46,"context_line":"  rpc RunLease(RunLeaseRequest) returns (stream RunLeaseUpdate);"},{"line_number":47,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"0550c36b_dff1eeab","line":44,"range":{"start_line":44,"start_character":6,"end_line":44,"end_character":27},"in_reply_to":"bd5c9cec_b9116601","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":46,"context_line":"  rpc RunLease(RunLeaseRequest) returns (stream RunLeaseUpdate);"},{"line_number":47,"context_line":"}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"// LeaseMode represents the different modes VM run authorizations can be managed."},{"line_number":50,"context_line":"enum LeaseMode {"},{"line_number":51,"context_line":"  LM_UNKNOWN \u003d 0;"},{"line_number":52,"context_line":"  // In storage locking mode mutual exclusion is provided through locks on the backing block storage system. Control"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"2e2351ad_b7ad2b99","line":49,"updated":"2021-06-08 14:28:17.000000000","message":"This needs documentation (perhaps as part of the RunLease docstring) that running a lease is something that the VM hypervisor needs to attempt at all times when it\u0027s running, and that depending on the mode, different guarantees are given about the system.\n\nIt needs to explain what a \u0027VM run authorization\u0027 means and why this is even a problem. One or two paragraphs summarizing this design choice here would also be beneficial for when we\u0027re writing user docs :).","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7b4023b22e03b002b222f6f3339d2193ec9fcc4c","unresolved":false,"context_lines":[{"line_number":46,"context_line":"  rpc RunLease(RunLeaseRequest) returns (stream RunLeaseUpdate);"},{"line_number":47,"context_line":"}"},{"line_number":48,"context_line":""},{"line_number":49,"context_line":"// LeaseMode represents the different modes VM run authorizations can be managed."},{"line_number":50,"context_line":"enum LeaseMode {"},{"line_number":51,"context_line":"  LM_UNKNOWN \u003d 0;"},{"line_number":52,"context_line":"  // In storage locking mode mutual exclusion is provided through locks on the backing block storage system. Control"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"ec3d0ee4_b60d6150","line":49,"in_reply_to":"2e2351ad_b7ad2b99","updated":"2021-06-16 18:45:47.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":49,"context_line":"// LeaseMode represents the different modes VM run authorizations can be managed."},{"line_number":50,"context_line":"enum LeaseMode {"},{"line_number":51,"context_line":"  LM_UNKNOWN \u003d 0;"},{"line_number":52,"context_line":"  // In storage locking mode mutual exclusion is provided through locks on the backing block storage system. Control"},{"line_number":53,"context_line":"  // plane convergence is only on a best-effort basis, under certain K8s failure modes the VM control plane might never"},{"line_number":54,"context_line":"  // converge. This mode is appropriate for local storage as the full leases mode would introduce more disruptions than"},{"line_number":55,"context_line":"  // it solves under these constraints."}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"90b35479_8f64cbc2","line":52,"range":{"start_line":52,"start_character":5,"end_line":52,"end_character":107},"updated":"2021-06-08 14:28:17.000000000","message":"`... and the hypervisor does not need to fence itself off from storage if the controller is unreachable.`\n\nI think it\u0027s critical to outline that the different modes mean different requirements for the VM hypervisor. Same for LM_FULL_LEASES.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"7b4023b22e03b002b222f6f3339d2193ec9fcc4c","unresolved":false,"context_lines":[{"line_number":49,"context_line":"// LeaseMode represents the different modes VM run authorizations can be managed."},{"line_number":50,"context_line":"enum LeaseMode {"},{"line_number":51,"context_line":"  LM_UNKNOWN \u003d 0;"},{"line_number":52,"context_line":"  // In storage locking mode mutual exclusion is provided through locks on the backing block storage system. Control"},{"line_number":53,"context_line":"  // plane convergence is only on a best-effort basis, under certain K8s failure modes the VM control plane might never"},{"line_number":54,"context_line":"  // converge. This mode is appropriate for local storage as the full leases mode would introduce more disruptions than"},{"line_number":55,"context_line":"  // it solves under these constraints."}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"c94d23fe_30fc9e00","line":52,"range":{"start_line":52,"start_character":5,"end_line":52,"end_character":107},"in_reply_to":"90b35479_8f64cbc2","updated":"2021-06-16 18:45:47.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":64,"context_line":"  string name \u003d 1; // Name of the VM object"},{"line_number":65,"context_line":"  string namespace \u003d 2; // Namespace of the VM object"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  string pod_name \u003d 3;"},{"line_number":68,"context_line":"  uint64 run_id \u003d 4;"},{"line_number":69,"context_line":"}"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"8db6072a_4f7e68de","line":67,"range":{"start_line":67,"start_character":9,"end_line":67,"end_character":17},"updated":"2021-06-08 14:28:17.000000000","message":"nit: // Name of the pod that the VM hypervisor has been started with, retrieved from the environment by the hypervisor on startup.\n\nOr something like that. Where do we get this from, actually? POD_NAME downward API?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":64,"context_line":"  string name \u003d 1; // Name of the VM object"},{"line_number":65,"context_line":"  string namespace \u003d 2; // Namespace of the VM object"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  string pod_name \u003d 3;"},{"line_number":68,"context_line":"  uint64 run_id \u003d 4;"},{"line_number":69,"context_line":"}"},{"line_number":70,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"93340a44_dbec0505","line":67,"range":{"start_line":67,"start_character":9,"end_line":67,"end_character":17},"in_reply_to":"8db6072a_4f7e68de","updated":"2021-06-16 12:49:52.000000000","message":"We get this from downward API (fieldRef metadata.name) via environment.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":65,"context_line":"  string namespace \u003d 2; // Namespace of the VM object"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  string pod_name \u003d 3;"},{"line_number":68,"context_line":"  uint64 run_id \u003d 4;"},{"line_number":69,"context_line":"}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"message RunLeaseUpdate {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"a26ec79c_e1925a57","line":68,"range":{"start_line":68,"start_character":9,"end_line":68,"end_character":15},"updated":"2021-06-08 14:28:17.000000000","message":"Document the run_id.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":65,"context_line":"  string namespace \u003d 2; // Namespace of the VM object"},{"line_number":66,"context_line":""},{"line_number":67,"context_line":"  string pod_name \u003d 3;"},{"line_number":68,"context_line":"  uint64 run_id \u003d 4;"},{"line_number":69,"context_line":"}"},{"line_number":70,"context_line":""},{"line_number":71,"context_line":"message RunLeaseUpdate {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"edf798e8_0894176b","line":68,"range":{"start_line":68,"start_character":9,"end_line":68,"end_character":15},"in_reply_to":"a26ec79c_e1925a57","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":74,"context_line":"    // The pod should keep running its VM"},{"line_number":75,"context_line":"    OK \u003d 1;"},{"line_number":76,"context_line":"    // The pod should terminate the VM immediately and exit"},{"line_number":77,"context_line":"    UNAUTHORIZED \u003d 2;"},{"line_number":78,"context_line":"  }"},{"line_number":79,"context_line":"  Status status \u003d 1;"},{"line_number":80,"context_line":"  LeaseMode lease_mode \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"9aaed713_dbabd401","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":16},"updated":"2021-06-08 14:28:17.000000000","message":"Hm, shouldn\u0027t this be TERMINATE, as per the comment? Calling this \u0027UNAUTHORIZED\u0027 at least deserved an explanation.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":74,"context_line":"    // The pod should keep running its VM"},{"line_number":75,"context_line":"    OK \u003d 1;"},{"line_number":76,"context_line":"    // The pod should terminate the VM immediately and exit"},{"line_number":77,"context_line":"    UNAUTHORIZED \u003d 2;"},{"line_number":78,"context_line":"  }"},{"line_number":79,"context_line":"  Status status \u003d 1;"},{"line_number":80,"context_line":"  LeaseMode lease_mode \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"52ae968c_41c642ab","line":77,"range":{"start_line":77,"start_character":4,"end_line":77,"end_character":16},"in_reply_to":"9aaed713_dbabd401","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":77,"context_line":"    UNAUTHORIZED \u003d 2;"},{"line_number":78,"context_line":"  }"},{"line_number":79,"context_line":"  Status status \u003d 1;"},{"line_number":80,"context_line":"  LeaseMode lease_mode \u003d 2;"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"message CreateMigrationTargetRequest {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b2627381_f32c9af5","line":80,"range":{"start_line":80,"start_character":12,"end_line":80,"end_character":22},"updated":"2021-06-08 14:28:17.000000000","message":"Shouldn\u0027t this be in VMSpec? Having this here implies that the hypervisor only knows about what mode it should be running in after it successfully starts a lease of some sort, and maybe even implies that the lease mode can change at runtime?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":77,"context_line":"    UNAUTHORIZED \u003d 2;"},{"line_number":78,"context_line":"  }"},{"line_number":79,"context_line":"  Status status \u003d 1;"},{"line_number":80,"context_line":"  LeaseMode lease_mode \u003d 2;"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"message CreateMigrationTargetRequest {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"8263169a_ec17c600","line":80,"range":{"start_line":80,"start_character":12,"end_line":80,"end_character":22},"in_reply_to":"b2627381_f32c9af5","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":80,"context_line":"  LeaseMode lease_mode \u003d 2;"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"message CreateMigrationTargetRequest {"},{"line_number":84,"context_line":"  // name of the VM resource being migrated"},{"line_number":85,"context_line":"  string name \u003d 1;"},{"line_number":86,"context_line":"  // namespace the VM resource is in"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"434f19b9_d302b14a","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":14},"updated":"2021-06-08 14:28:17.000000000","message":"nit: I\u0027m not sure about \u0027Create\u0027 here. The new migration target might already exist in some cases, so this is more of a \u0027Get\u0027/\u0027Ensure\u0027/\u0027Prepare\u0027, no?\n\nThe rpc docstring should explain this, too.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":80,"context_line":"  LeaseMode lease_mode \u003d 2;"},{"line_number":81,"context_line":"}"},{"line_number":82,"context_line":""},{"line_number":83,"context_line":"message CreateMigrationTargetRequest {"},{"line_number":84,"context_line":"  // name of the VM resource being migrated"},{"line_number":85,"context_line":"  string name \u003d 1;"},{"line_number":86,"context_line":"  // namespace the VM resource is in"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"497c3b6c_7266b662","line":83,"range":{"start_line":83,"start_character":8,"end_line":83,"end_character":14},"in_reply_to":"434f19b9_d302b14a","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":84,"context_line":"  // name of the VM resource being migrated"},{"line_number":85,"context_line":"  string name \u003d 1;"},{"line_number":86,"context_line":"  // namespace the VM resource is in"},{"line_number":87,"context_line":"  string namespace \u003d 2;"},{"line_number":88,"context_line":"}"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"message MigrationSwitchoverRequest {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"3887cb63_6abc6f46","line":87,"updated":"2021-06-08 14:28:17.000000000","message":"Should we also submit the run_id? Should we maybe wrap the namespace/vm_name/pod_name/run_id tuple into a HypervisorID message and use that wherever possible?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":84,"context_line":"  // name of the VM resource being migrated"},{"line_number":85,"context_line":"  string name \u003d 1;"},{"line_number":86,"context_line":"  // namespace the VM resource is in"},{"line_number":87,"context_line":"  string namespace \u003d 2;"},{"line_number":88,"context_line":"}"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"message MigrationSwitchoverRequest {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"a9c9daae_974ba052","line":87,"in_reply_to":"3887cb63_6abc6f46","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":88,"context_line":"}"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"message MigrationSwitchoverRequest {"},{"line_number":91,"context_line":"  string name \u003d 1;"},{"line_number":92,"context_line":"  string namespace \u003d 2;"},{"line_number":93,"context_line":"  string new_pod_name \u003d 3;"},{"line_number":94,"context_line":"  string old_pod_name \u003d 4;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"7b46298b_3d8be223","line":91,"updated":"2021-06-08 14:28:17.000000000","message":"If we go for a HypervisorID message, this could be:\n\nHypervisorID us \u003d 1;\nHypervsiorID them \u003d 2;\n\n(or new/old, but I think I slightly prefer us/them or local/remote ; but I don\u0027t mind either way)\n\nSome repeated data (namespace and pod name are repeated), but makes for a slightly cleaner proto.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":88,"context_line":"}"},{"line_number":89,"context_line":""},{"line_number":90,"context_line":"message MigrationSwitchoverRequest {"},{"line_number":91,"context_line":"  string name \u003d 1;"},{"line_number":92,"context_line":"  string namespace \u003d 2;"},{"line_number":93,"context_line":"  string new_pod_name \u003d 3;"},{"line_number":94,"context_line":"  string old_pod_name \u003d 4;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"eb1cf616_cb63a0ce","line":91,"in_reply_to":"7b46298b_3d8be223","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":96,"context_line":"  uint64 old_run_id \u003d 6;"},{"line_number":97,"context_line":"}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"message MigrationSwitchoverResponse {"},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"message CreateMigrationTargetResponse {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"ef97b601_daafacfe","line":99,"updated":"2021-06-08 14:28:17.000000000","message":"There should be documentation somewhere about what does status-level success/failure mean for the semantics of this rpc. It\u0027s a complex call hiding some complex logic, and documenting that thoroughly next to the rpc is probably a good idea.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":96,"context_line":"  uint64 old_run_id \u003d 6;"},{"line_number":97,"context_line":"}"},{"line_number":98,"context_line":""},{"line_number":99,"context_line":"message MigrationSwitchoverResponse {"},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"message CreateMigrationTargetResponse {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"2b553363_a47ad5bb","line":99,"in_reply_to":"ef97b601_daafacfe","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":99,"context_line":"message MigrationSwitchoverResponse {"},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"message CreateMigrationTargetResponse {"},{"line_number":103,"context_line":"  enum Action {"},{"line_number":104,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":105,"context_line":"    LIVE_MIGRATE \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"89443fd2_1f2f199f","line":102,"updated":"2021-06-08 14:28:17.000000000","message":"nit: reorder messages: CreateMigrationTargetRequest, CreateMigrationTargetResponse, MigrationSwitchoverRequest, MigrationSwitchoverResponse, RunLeaseRequest, RunLeaseUpdate - to correspond with rpc ordering. Interleaving with helper/intermediary structs is perfectly fine.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":99,"context_line":"message MigrationSwitchoverResponse {"},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"message CreateMigrationTargetResponse {"},{"line_number":103,"context_line":"  enum Action {"},{"line_number":104,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":105,"context_line":"    LIVE_MIGRATE \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"ef60a783_e0d66a3c","line":102,"in_reply_to":"89443fd2_1f2f199f","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":113,"context_line":"// The OOBManagement service is exposed by each VM pod to perform OOB maintenance on the VM running inside of it."},{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"3f04d6eb_d1027544","line":116,"updated":"2021-06-08 14:28:17.000000000","message":"Do we need this straight away?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":113,"context_line":"// The OOBManagement service is exposed by each VM pod to perform OOB maintenance on the VM running inside of it."},{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"cbb7073b_9c17f3ee","line":116,"in_reply_to":"0dc098e5_320ef3b7","updated":"2021-06-17 09:29:30.000000000","message":"YAGNI, IMO. It\u0027s easier to add it later as needed and when we know what it for, versus implementing it in a vacuum and possibly implement something broken/unusable that we then need to continue supporting because someone depended on it.\n\nhttps://google.github.io/eng-practices/review/reviewer/looking-for.html#complexity","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":true,"context_lines":[{"line_number":113,"context_line":"// The OOBManagement service is exposed by each VM pod to perform OOB maintenance on the VM running inside of it."},{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"0dc098e5_320ef3b7","line":116,"in_reply_to":"3f04d6eb_d1027544","updated":"2021-06-16 12:49:52.000000000","message":"It\u0027s trivial to implement (literally a single QMP call) and IMO very useful. But the product will work without it.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"5de678fe5554ddd898f591743433114b765181c7","unresolved":true,"context_lines":[{"line_number":113,"context_line":"// The OOBManagement service is exposed by each VM pod to perform OOB maintenance on the VM running inside of it."},{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"2dc3aaaa_bd60fadb","line":116,"in_reply_to":"63b78c10_4495fa26","updated":"2021-06-20 10:58:37.000000000","message":"I don\u0027t know if we should have NMIs as a feature. Maybe we will in the future, maybe we won\u0027t. However, I\u0027m not aware of any need for it right now, so I don\u0027t see a reason to implement it here.\n\nDesigning an RPC for NMI later on is trivial (especially once we know what the use for it is), fixing a broken API is not. This proto is a long-term contract (as OOBManagement is, IIUC, a public-facing API) and we should be very careful about what we promise.\n\nYAGNI expands to \u0027you ain\u0027t gonna need it\u0027, but that\u0027s not really what it means. Google\u0027s Code Review Guidelines [1] say it a bit better, but without a catchy acronym:\n\n“Encourage developers to solve the problem they know needs to be solved now, not the problem that the developer speculates might need to be solved in the future. The future problem should be solved once it arrives and you can see its actual shape and requirements in the physical universe.”\n\n[1] - https://google.github.io/eng-practices/review/reviewer/looking-for.html#complexity","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"eed3e080b737154054759f9115d7d748920403ea","unresolved":true,"context_lines":[{"line_number":113,"context_line":"// The OOBManagement service is exposed by each VM pod to perform OOB maintenance on the VM running inside of it."},{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"63b78c10_4495fa26","line":116,"in_reply_to":"cbb7073b_9c17f3ee","updated":"2021-06-17 21:05:58.000000000","message":"Are you saying we shouldn\u0027t have NMIs as a feature?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":113,"context_line":"// The OOBManagement service is exposed by each VM pod to perform OOB maintenance on the VM running inside of it."},{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"d980d1b2_6fc0a67b","line":116,"in_reply_to":"cbb7073b_9c17f3ee","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"},{"line_number":120,"context_line":"  rpc Console(stream ConsoleIO) returns (stream ConsoleIO);"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"bd0ffc48_f4c5c1bb","line":117,"updated":"2021-06-08 14:28:17.000000000","message":"But the VM hypervisor keeps running, right?\n\nSpeculation: In the future, we might want some sort of \u0027reset counter\u0027 here maybe, so that we ensure we only reset once (eg. client web interface operates on \u0027there have been 3 restarts so far\u0027, sends a \u0027okay i want to restart the vm, i know that there have been 3 so far\u0027, and some repeated/lost messages and/or concurrent access don\u0027t cause spurious reboots). Same for NMI.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"},{"line_number":120,"context_line":"  rpc Console(stream ConsoleIO) returns (stream ConsoleIO);"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"6606e125_5377bd04","line":117,"in_reply_to":"0781f4ad_19551703","updated":"2021-06-17 09:29:30.000000000","message":"The fact that it only resets registers and doesn\u0027t have an effect on the hypervisor should be documented.\n\nRe: idempotency counters: let\u0027s add this later, perhaps add a TODO(issue or you) and mention that this API is likely subject to change.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"49fa12cb0a09ef3d3718bfc317d62df1d00c082c","unresolved":false,"context_lines":[{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"},{"line_number":120,"context_line":"  rpc Console(stream ConsoleIO) returns (stream ConsoleIO);"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"97cdd607_df9da98d","line":117,"in_reply_to":"6606e125_5377bd04","updated":"2021-06-22 12:04:07.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":true,"context_lines":[{"line_number":114,"context_line":"service OOBManagement {"},{"line_number":115,"context_line":"  // InjectNMI injects a Non-Maskable Interrupt into the VM to debug stuck VMs"},{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"},{"line_number":120,"context_line":"  rpc Console(stream ConsoleIO) returns (stream ConsoleIO);"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"0781f4ad_19551703","line":117,"in_reply_to":"bd0ffc48_f4c5c1bb","updated":"2021-06-16 12:49:52.000000000","message":"Yes, this has no effect on the hypervisor. It just resets registers in the virtual CPU. Counters for these two imperative actions sound like a nice idea, do we want to go for this immedately or do we want to defer this for later?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"},{"line_number":120,"context_line":"  rpc Console(stream ConsoleIO) returns (stream ConsoleIO);"},{"line_number":121,"context_line":"}"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"7b2a8db1_fdb93019","line":119,"range":{"start_line":119,"start_character":5,"end_line":119,"end_character":105},"updated":"2021-06-08 14:28:17.000000000","message":"How is the result stream buffered, how is concurrent accesses handled?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":116,"context_line":"  rpc InjectNMI(InjectNMIRequest) returns (InjectNMIResponse);"},{"line_number":117,"context_line":"  // Reset resets the virtual CPU of the VM (a hard reboot)"},{"line_number":118,"context_line":"  rpc Reset(ResetRequest) returns (ResetResponse);"},{"line_number":119,"context_line":"  // Console opens a bidirectional stream to the virtual serial port (for debugging or OOB data transfer)"},{"line_number":120,"context_line":"  rpc Console(stream ConsoleIO) returns (stream ConsoleIO);"},{"line_number":121,"context_line":"}"},{"line_number":122,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"ae07d2bd_8c55393e","line":119,"range":{"start_line":119,"start_character":5,"end_line":119,"end_character":105},"in_reply_to":"7b2a8db1_fdb93019","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":127,"context_line":"message ResetResponse {}"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"message ConsoleIO {"},{"line_number":130,"context_line":"  string data \u003d 1;"},{"line_number":131,"context_line":"}"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"// The Hypervisor service is exposed by each VM pod for migrations."}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"b7bb7909_abcd21e3","line":130,"range":{"start_line":130,"start_character":2,"end_line":130,"end_character":8},"updated":"2021-06-08 14:28:17.000000000","message":"Shouldn\u0027t this be bytes? We can\u0027t guarantee that the VM is not spewing out some totally broken binary data to stdout in some cases.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":127,"context_line":"message ResetResponse {}"},{"line_number":128,"context_line":""},{"line_number":129,"context_line":"message ConsoleIO {"},{"line_number":130,"context_line":"  string data \u003d 1;"},{"line_number":131,"context_line":"}"},{"line_number":132,"context_line":""},{"line_number":133,"context_line":"// The Hypervisor service is exposed by each VM pod for migrations."}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"79be1f20_f1f7f658","line":130,"range":{"start_line":130,"start_character":2,"end_line":130,"end_character":8},"in_reply_to":"b7bb7909_abcd21e3","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"message StartMigrationRequest {"},{"line_number":148,"context_line":"  // List of migration protocols supported by the source pod"},{"line_number":149,"context_line":"  repeated MigrationProtocol supported_migration_protocol \u003d 1;"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  string source_pod_name \u003d 2;"},{"line_number":152,"context_line":"  uint64 source_run_id \u003d 3;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"d9340fe7_034975d8","line":149,"updated":"2021-06-08 14:28:17.000000000","message":"This should probably be repeated message containing a oneof, in case we want to have tagged unions here instead of a simple enum. Repeated unary fields in proto are annoying to migrate forward and oneofs are unwieldy, pick your poison... :)","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":146,"context_line":""},{"line_number":147,"context_line":"message StartMigrationRequest {"},{"line_number":148,"context_line":"  // List of migration protocols supported by the source pod"},{"line_number":149,"context_line":"  repeated MigrationProtocol supported_migration_protocol \u003d 1;"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  string source_pod_name \u003d 2;"},{"line_number":152,"context_line":"  uint64 source_run_id \u003d 3;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"2491a667_740871a4","line":149,"in_reply_to":"d9340fe7_034975d8","updated":"2021-06-16 12:49:52.000000000","message":"Adressed below","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":148,"context_line":"  // List of migration protocols supported by the source pod"},{"line_number":149,"context_line":"  repeated MigrationProtocol supported_migration_protocol \u003d 1;"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  string source_pod_name \u003d 2;"},{"line_number":152,"context_line":"  uint64 source_run_id \u003d 3;"},{"line_number":153,"context_line":"  string source_pvc_name \u003d 4;"},{"line_number":154,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"8041dfe5_d8e93059","line":151,"updated":"2021-06-08 14:28:17.000000000","message":"nit: another spot where we could use a HypervisorID instead.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":148,"context_line":"  // List of migration protocols supported by the source pod"},{"line_number":149,"context_line":"  repeated MigrationProtocol supported_migration_protocol \u003d 1;"},{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  string source_pod_name \u003d 2;"},{"line_number":152,"context_line":"  uint64 source_run_id \u003d 3;"},{"line_number":153,"context_line":"  string source_pvc_name \u003d 4;"},{"line_number":154,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"173beea7_75a81f89","line":151,"in_reply_to":"8041dfe5_d8e93059","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  string source_pod_name \u003d 2;"},{"line_number":152,"context_line":"  uint64 source_run_id \u003d 3;"},{"line_number":153,"context_line":"  string source_pvc_name \u003d 4;"},{"line_number":154,"context_line":"}"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"message StartMigrationResponse {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"56dc3906_b1da70ea","line":153,"updated":"2021-06-08 14:28:17.000000000","message":"What is the pvc name used for here? Where does the VM hypervisor actually get it from?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":150,"context_line":""},{"line_number":151,"context_line":"  string source_pod_name \u003d 2;"},{"line_number":152,"context_line":"  uint64 source_run_id \u003d 3;"},{"line_number":153,"context_line":"  string source_pvc_name \u003d 4;"},{"line_number":154,"context_line":"}"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"message StartMigrationResponse {"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"dcffc149_c326c748","line":153,"in_reply_to":"56dc3906_b1da70ea","updated":"2021-06-16 12:49:52.000000000","message":"Artifact from previous iterations, I dropped the field.","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":154,"context_line":"}"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"message StartMigrationResponse {"},{"line_number":157,"context_line":"  // Migration protocol chosen from supported_migration_protocol by the target pod"},{"line_number":158,"context_line":"  MigrationProtocol migration_protocol \u003d 1;"},{"line_number":159,"context_line":"  // Protocol-specific bulk migration endpoint"},{"line_number":160,"context_line":"  string bulk_migration_endpoint \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"3eee53a7_105f725f","line":157,"updated":"2021-06-08 14:28:17.000000000","message":"What if there\u0027s no common migration protocol? Is an error returned?","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"aadf6b6d46990c150bc9622147f13d49b5cc1b7c","unresolved":false,"context_lines":[{"line_number":154,"context_line":"}"},{"line_number":155,"context_line":""},{"line_number":156,"context_line":"message StartMigrationResponse {"},{"line_number":157,"context_line":"  // Migration protocol chosen from supported_migration_protocol by the target pod"},{"line_number":158,"context_line":"  MigrationProtocol migration_protocol \u003d 1;"},{"line_number":159,"context_line":"  // Protocol-specific bulk migration endpoint"},{"line_number":160,"context_line":"  string bulk_migration_endpoint \u003d 2;"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"f3a4f02f_51ab796c","line":157,"in_reply_to":"3eee53a7_105f725f","updated":"2021-06-16 12:49:52.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"50619e2cb9b604ade8b27f8a997ef793556dc1fc","unresolved":true,"context_lines":[{"line_number":157,"context_line":"  // Migration protocol chosen from supported_migration_protocol by the target pod"},{"line_number":158,"context_line":"  MigrationProtocol migration_protocol \u003d 1;"},{"line_number":159,"context_line":"  // Protocol-specific bulk migration endpoint"},{"line_number":160,"context_line":"  string bulk_migration_endpoint \u003d 2;"},{"line_number":161,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"bab03fcf_52c3c534","line":160,"updated":"2021-06-08 14:28:17.000000000","message":"I\u0027d attempt to also shove that into a oneof somehow, so that it\u0027s a bit better typed (it can be a string for qemu). Maybe we can unify the migration type system into something like this?\n\nmessage MigrationProtocol {\n    // For each migration protocol message, some fields will be set by the source\n    // as constraints (constraint_*), and some will be populated by the target if \n    // that migration protocol is picked (negotiated_*).\n    // The migration target will keep all constraint_* fields that it was aware\n    // of, so that the source can verify that all critical fields were considered\n    // by the target (thereby allowing different versions of source/target to\n    // communicate).\n\n    message QemuBlock {\n        uint64 constraint_number_of_disks \u003d 1;\n        string negotiated_endpoint \u003d 2;\n    }\n    oneof kind {\n        QemuBlock qmeu_block \u003d 1;\n    }\n}\n\nmessage StartMigrationRequest {\n    repeated MigrationProtocol supported_protocols \u003d 1;\n}\n\nmessage StartMigrationResponse {\n    MessageProtocol negotiated_protocol \u003d 1;\n}","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"bc2009e651e27dfa93e019a8747c31b697d4543f","unresolved":false,"context_lines":[{"line_number":157,"context_line":"  // Migration protocol chosen from supported_migration_protocol by the target pod"},{"line_number":158,"context_line":"  MigrationProtocol migration_protocol \u003d 1;"},{"line_number":159,"context_line":"  // Protocol-specific bulk migration endpoint"},{"line_number":160,"context_line":"  string bulk_migration_endpoint \u003d 2;"},{"line_number":161,"context_line":"}"}],"source_content_type":"text/x-protobuf","patch_set":1,"id":"c6675168_959deb24","line":160,"in_reply_to":"bab03fcf_52c3c534","updated":"2021-06-16 16:18:36.000000000","message":"Done","commit_id":"8aed275d2089703b758ca2b94efc52144bd6be47"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":98,"context_line":"  string pod_name \u003d 3;"},{"line_number":99,"context_line":"  // run_id is selected by the hypervisor at the start of the process to"},{"line_number":100,"context_line":"  // uniquely identify that specific running process. A process which starts"},{"line_number":101,"context_line":"  // later should have a higher run_id so that the controller can know that. In"},{"line_number":102,"context_line":"  // practice this should be derived from a precise timestamp like nanoseconds"},{"line_number":103,"context_line":"  // since the UNIX epoch."},{"line_number":104,"context_line":"  uint64 run_id \u003d 4;"}],"source_content_type":"text/x-protobuf","patch_set":5,"id":"3ed7c7a7_8091e5ca","line":101,"range":{"start_line":101,"start_character":5,"end_line":101,"end_character":10},"updated":"2021-06-17 09:29:30.000000000","message":"... later on the same physical machine / node. We can\u0027t guarantee 100% global time ordering with nanosecond timestamps unless we have very precise inter-node time sync.\n\nAnd we don\u0027t need it anyway, as the run_id alongside a pod_name should be enough to identify every run uniquely across the cluster (since pods never get rescheduled across machines - right?).","commit_id":"d845c32205655cc29fe00d44543558c021f34a95"},{"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":"f2971d6c1e2ff307da81954de8753e57b1576c71","unresolved":true,"context_lines":[{"line_number":98,"context_line":"  string pod_name \u003d 3;"},{"line_number":99,"context_line":"  // run_id is selected by the hypervisor at the start of the process to"},{"line_number":100,"context_line":"  // uniquely identify that specific running process. A process which starts"},{"line_number":101,"context_line":"  // later should have a higher run_id so that the controller can know that. In"},{"line_number":102,"context_line":"  // practice this should be derived from a precise timestamp like nanoseconds"},{"line_number":103,"context_line":"  // since the UNIX epoch."},{"line_number":104,"context_line":"  uint64 run_id \u003d 4;"}],"source_content_type":"text/x-protobuf","patch_set":5,"id":"4a1fb7c1_e21e652f","line":101,"range":{"start_line":101,"start_character":5,"end_line":101,"end_character":10},"in_reply_to":"04dcdbfe_a31820be","updated":"2021-06-21 14:52:16.000000000","message":"This should be noted in the comment.","commit_id":"d845c32205655cc29fe00d44543558c021f34a95"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":true,"context_lines":[{"line_number":98,"context_line":"  string pod_name \u003d 3;"},{"line_number":99,"context_line":"  // run_id is selected by the hypervisor at the start of the process to"},{"line_number":100,"context_line":"  // uniquely identify that specific running process. A process which starts"},{"line_number":101,"context_line":"  // later should have a higher run_id so that the controller can know that. In"},{"line_number":102,"context_line":"  // practice this should be derived from a precise timestamp like nanoseconds"},{"line_number":103,"context_line":"  // since the UNIX epoch."},{"line_number":104,"context_line":"  uint64 run_id \u003d 4;"}],"source_content_type":"text/x-protobuf","patch_set":5,"id":"04dcdbfe_a31820be","line":101,"range":{"start_line":101,"start_character":5,"end_line":101,"end_character":10},"in_reply_to":"3ed7c7a7_8091e5ca","updated":"2021-06-21 11:18:53.000000000","message":"Yes, later with respect to other instances on the same node. And yes, K8s can never move an already-scheduled pod between nodes.","commit_id":"d845c32205655cc29fe00d44543558c021f34a95"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"864f3d12f3ef89a05743411848992e17381fc863","unresolved":false,"context_lines":[{"line_number":98,"context_line":"  string pod_name \u003d 3;"},{"line_number":99,"context_line":"  // run_id is selected by the hypervisor at the start of the process to"},{"line_number":100,"context_line":"  // uniquely identify that specific running process. A process which starts"},{"line_number":101,"context_line":"  // later should have a higher run_id so that the controller can know that. In"},{"line_number":102,"context_line":"  // practice this should be derived from a precise timestamp like nanoseconds"},{"line_number":103,"context_line":"  // since the UNIX epoch."},{"line_number":104,"context_line":"  uint64 run_id \u003d 4;"}],"source_content_type":"text/x-protobuf","patch_set":5,"id":"ee5eb9e5_bfa784a8","line":101,"range":{"start_line":101,"start_character":5,"end_line":101,"end_character":10},"in_reply_to":"4a1fb7c1_e21e652f","updated":"2021-06-21 15:28:56.000000000","message":"Done","commit_id":"d845c32205655cc29fe00d44543558c021f34a95"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":25,"context_line":"  // starting the VM for the first time. Only used if starting with"},{"line_number":26,"context_line":"  // SM_PREPARE_IMAGE."},{"line_number":27,"context_line":"  InitialImage initial_image \u003d 4;"},{"line_number":28,"context_line":"  // List of IP addresses assigned to the VM. Populated from vmIPs in the"},{"line_number":29,"context_line":"  // VirtualMachine object."},{"line_number":30,"context_line":"  repeated string address \u003d 5;"},{"line_number":31,"context_line":"  // gRPC endpoint of the controller for this VM"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"84b6f22d_4265a99a","line":28,"range":{"start_line":28,"start_character":5,"end_line":28,"end_character":9},"updated":"2021-06-17 09:29:30.000000000","message":"nit: Set? ie., mention in a comment that these will be unique.\n\nWe should probably also explicitly mention how these are formatted/encoded.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":25,"context_line":"  // starting the VM for the first time. Only used if starting with"},{"line_number":26,"context_line":"  // SM_PREPARE_IMAGE."},{"line_number":27,"context_line":"  InitialImage initial_image \u003d 4;"},{"line_number":28,"context_line":"  // List of IP addresses assigned to the VM. Populated from vmIPs in the"},{"line_number":29,"context_line":"  // VirtualMachine object."},{"line_number":30,"context_line":"  repeated string address \u003d 5;"},{"line_number":31,"context_line":"  // gRPC endpoint of the controller for this VM"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"4b7fb7f9_3134bb05","line":28,"range":{"start_line":28,"start_character":5,"end_line":28,"end_character":9},"in_reply_to":"84b6f22d_4265a99a","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"// LeaseMode represents the different modes VM run authorizations can be"},{"line_number":46,"context_line":"// managed. This is necessary to ensure that each VM is only executed in one"},{"line_number":47,"context_line":"// hypervisor as this is a distributed system and node crashes and/or netsplits"},{"line_number":48,"context_line":"// can make it hard to determine the state of hypervisors running VMs which"},{"line_number":49,"context_line":"// could if left unchecked result in VMs running twice or not at all. Using"},{"line_number":50,"context_line":"// pseudo-leases or leases gives the control plane more direct control over the"},{"line_number":51,"context_line":"// hypervisors."},{"line_number":52,"context_line":"enum LeaseMode {"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"0140a2e2_4dcd39b1","line":49,"range":{"start_line":46,"start_character":12,"end_line":49,"end_character":69},"updated":"2021-06-17 09:29:30.000000000","message":"This is still a bit hard to parse and lacking some context, I think. What I think we should attempt to convey here is:\n\n- The Kubernetes control plane and the VM controller are both distributed systems.\n- As with any distributed system, partitions and node failures can happen and are indistinguishable from one another.\n- Kubernetes itself provides a certain degree of detecting node failures, but whatever workloads are still running on a partition node might continue running.\n- Kubernetes also doesn\u0027t fully protect against pods \u0027duplicates\u0027 on a single machine, especially in the face of Kubernetes bugs.\n- The two things above can lead to scenarios where a node failure or partition causes two workloads (pod on a lost node, or container lost on a buggy node) execute simultaneously even though the control planes are not aware of this.\n- When running stateful, storage-backed workloads like VMs it is critical that this doesn\u0027t happen, as that would lead to data corruption or just plain confusion.\n- Kubernetes backing storages do not all implement locking/fencing, so we cannot just rely on that.\n- Instead, two VM hypervisor specific solutions are implemented to provide mutual exclusion between any hypervisors attempting to run a single VM simultaneously, and they both have different trade-offs for different scenarios.\n- These are expressed as \u0027run authorizations\u0027, contracts between the hypervisor and controller code expressing when the hypervisor can run and how it should interact with the controller.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"29387f9966d6092f23d729a7c3bb1f519cb739f1","unresolved":false,"context_lines":[{"line_number":43,"context_line":"}"},{"line_number":44,"context_line":""},{"line_number":45,"context_line":"// LeaseMode represents the different modes VM run authorizations can be"},{"line_number":46,"context_line":"// managed. This is necessary to ensure that each VM is only executed in one"},{"line_number":47,"context_line":"// hypervisor as this is a distributed system and node crashes and/or netsplits"},{"line_number":48,"context_line":"// can make it hard to determine the state of hypervisors running VMs which"},{"line_number":49,"context_line":"// could if left unchecked result in VMs running twice or not at all. Using"},{"line_number":50,"context_line":"// pseudo-leases or leases gives the control plane more direct control over the"},{"line_number":51,"context_line":"// hypervisors."},{"line_number":52,"context_line":"enum LeaseMode {"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"28c06e91_152cc746","line":49,"range":{"start_line":46,"start_character":12,"end_line":49,"end_character":69},"in_reply_to":"0140a2e2_4dcd39b1","updated":"2021-06-21 14:18:30.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":55,"context_line":"  // provided through locks on the backing block storage system. Control plane"},{"line_number":56,"context_line":"  // convergence is only on a best-effort basis, under certain K8s failure modes"},{"line_number":57,"context_line":"  // the VM control plane might never converge. A Hypervisor that\u0027s partitioned"},{"line_number":58,"context_line":"  // from the control plane will continue to run its VM indefinitely and will"},{"line_number":59,"context_line":"  // not fence itself off from storage or networking. This mode is appropriate"},{"line_number":60,"context_line":"  // for local storage as the full leases mode would introduce more disruptions"},{"line_number":61,"context_line":"  // than it solves under these constraints."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"0eb1a667_85fc4676","line":58,"range":{"start_line":58,"start_character":56,"end_line":58,"end_character":68},"updated":"2021-06-17 09:29:30.000000000","message":"... However, if it can still access the VM controller RPC, it will be able to get STONINTH\u0027d [1] by the controller if detected as a duplicate / lost hypervisor.\n\n[1] - kinda. \u0027Fenced\u0027 is more accurate?","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":55,"context_line":"  // provided through locks on the backing block storage system. Control plane"},{"line_number":56,"context_line":"  // convergence is only on a best-effort basis, under certain K8s failure modes"},{"line_number":57,"context_line":"  // the VM control plane might never converge. A Hypervisor that\u0027s partitioned"},{"line_number":58,"context_line":"  // from the control plane will continue to run its VM indefinitely and will"},{"line_number":59,"context_line":"  // not fence itself off from storage or networking. This mode is appropriate"},{"line_number":60,"context_line":"  // for local storage as the full leases mode would introduce more disruptions"},{"line_number":61,"context_line":"  // than it solves under these constraints."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"974befab_4a1b703d","line":58,"range":{"start_line":58,"start_character":56,"end_line":58,"end_character":68},"in_reply_to":"0eb1a667_85fc4676","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"// PTPAddress contains the VM IP and the hypervisor IP for an IP point to"},{"line_number":84,"context_line":"// point interface. Both IPs need to be for the same IP protocol version (v4 or"},{"line_number":85,"context_line":"// v6)."},{"line_number":86,"context_line":"message PTPAddress {"},{"line_number":87,"context_line":"  // IP address of the VM"},{"line_number":88,"context_line":"  string ip \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"549fa220_733bd87c","line":85,"updated":"2021-06-17 09:29:30.000000000","message":"Maybe mention how this would be configured on Linux:\n\n  // For example, on Linux this could be configured by:\n  //  # ip link add $ip/32 dev eth1\n  //  # ip route add $peer_ip/32 dev eth1\n  // And, if that interface should be also the default gateway:\n  //  # ip route add default via $peer_ip\n\n... as I\u0027m not even sure the above is correct :).","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"// PTPAddress contains the VM IP and the hypervisor IP for an IP point to"},{"line_number":84,"context_line":"// point interface. Both IPs need to be for the same IP protocol version (v4 or"},{"line_number":85,"context_line":"// v6)."},{"line_number":86,"context_line":"message PTPAddress {"},{"line_number":87,"context_line":"  // IP address of the VM"},{"line_number":88,"context_line":"  string ip \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"8a88a5b0_a9e186b9","line":85,"in_reply_to":"3bdcf281_4ae1f728","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000000,"name":"Leopold Schabel","display_name":"Leo","email":"leo@monogon.tech","username":"leo","avatars":[{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/98f8f79a6bb45adef37defa7ead8f3d2.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"eed3e080b737154054759f9115d7d748920403ea","unresolved":true,"context_lines":[{"line_number":82,"context_line":""},{"line_number":83,"context_line":"// PTPAddress contains the VM IP and the hypervisor IP for an IP point to"},{"line_number":84,"context_line":"// point interface. Both IPs need to be for the same IP protocol version (v4 or"},{"line_number":85,"context_line":"// v6)."},{"line_number":86,"context_line":"message PTPAddress {"},{"line_number":87,"context_line":"  // IP address of the VM"},{"line_number":88,"context_line":"  string ip \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"3bdcf281_4ae1f728","line":85,"in_reply_to":"549fa220_733bd87c","updated":"2021-06-17 21:05:58.000000000","message":"I think it could be simplified to\n\n  ip addr add $ip/32 peer $peer_ip dev tun0","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":86,"context_line":"message PTPAddress {"},{"line_number":87,"context_line":"  // IP address of the VM"},{"line_number":88,"context_line":"  string ip \u003d 1;"},{"line_number":89,"context_line":"  // IP address of the hypervisor side, default gateway for the VM"},{"line_number":90,"context_line":"  string peer_ip \u003d 2;"},{"line_number":91,"context_line":"}"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"4a970770_2f0b8700","line":89,"range":{"start_line":89,"start_character":40,"end_line":89,"end_character":66},"updated":"2021-06-17 09:29:30.000000000","message":"If there\u0027s more than one PTPAddress in the VM, only one (per protocol) can also be used as the default gateway. I know we state this within NetworkConfig.address, but maybe this should be reiterated/referenced here?","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":true,"context_lines":[{"line_number":86,"context_line":"message PTPAddress {"},{"line_number":87,"context_line":"  // IP address of the VM"},{"line_number":88,"context_line":"  string ip \u003d 1;"},{"line_number":89,"context_line":"  // IP address of the hypervisor side, default gateway for the VM"},{"line_number":90,"context_line":"  string peer_ip \u003d 2;"},{"line_number":91,"context_line":"}"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"cf3bff75_35deb990","line":89,"range":{"start_line":89,"start_character":40,"end_line":89,"end_character":66},"in_reply_to":"4a970770_2f0b8700","updated":"2021-06-21 11:18:53.000000000","message":"There cannot be more than one per protocol. More IPs will be realized (not in this iteration) by just routing them to the VM IP.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"f2971d6c1e2ff307da81954de8753e57b1576c71","unresolved":false,"context_lines":[{"line_number":86,"context_line":"message PTPAddress {"},{"line_number":87,"context_line":"  // IP address of the VM"},{"line_number":88,"context_line":"  string ip \u003d 1;"},{"line_number":89,"context_line":"  // IP address of the hypervisor side, default gateway for the VM"},{"line_number":90,"context_line":"  string peer_ip \u003d 2;"},{"line_number":91,"context_line":"}"},{"line_number":92,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"542c2b03_23d84c48","line":89,"range":{"start_line":89,"start_character":40,"end_line":89,"end_character":66},"in_reply_to":"cf3bff75_35deb990","updated":"2021-06-21 14:52:16.000000000","message":"Ack","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":114,"context_line":"  uint64 run_id \u003d 4;"},{"line_number":115,"context_line":"}"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"message RunLeaseRequest { HypervisorID us \u003d 1; }"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"message RunLeaseUpdate {"},{"line_number":120,"context_line":"  enum Status {"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"f5187e54_e59fe61a","line":117,"range":{"start_line":117,"start_character":24,"end_line":117,"end_character":48},"updated":"2021-06-17 09:29:30.000000000","message":"style: Uncollapse this into multiple lines (same at line 136).","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":114,"context_line":"  uint64 run_id \u003d 4;"},{"line_number":115,"context_line":"}"},{"line_number":116,"context_line":""},{"line_number":117,"context_line":"message RunLeaseRequest { HypervisorID us \u003d 1; }"},{"line_number":118,"context_line":""},{"line_number":119,"context_line":"message RunLeaseUpdate {"},{"line_number":120,"context_line":"  enum Status {"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"41769c56_befbb990","line":117,"range":{"start_line":117,"start_character":24,"end_line":117,"end_character":48},"in_reply_to":"f5187e54_e59fe61a","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"message RunLeaseUpdate {"},{"line_number":120,"context_line":"  enum Status {"},{"line_number":121,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":122,"context_line":"    // The pod should keep running its VM"},{"line_number":123,"context_line":"    OK \u003d 1;"},{"line_number":124,"context_line":"    // The pod should terminate the VM immediately and exit"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"e26f872f_c9057213","line":121,"range":{"start_line":121,"start_character":4,"end_line":121,"end_character":11},"updated":"2021-06-17 09:29:30.000000000","message":"Prefix with STATUS_.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":118,"context_line":""},{"line_number":119,"context_line":"message RunLeaseUpdate {"},{"line_number":120,"context_line":"  enum Status {"},{"line_number":121,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":122,"context_line":"    // The pod should keep running its VM"},{"line_number":123,"context_line":"    OK \u003d 1;"},{"line_number":124,"context_line":"    // The pod should terminate the VM immediately and exit"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"90bbb235_2b636b97","line":121,"range":{"start_line":121,"start_character":4,"end_line":121,"end_character":11},"in_reply_to":"e26f872f_c9057213","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"message EnsureMigrationTargetResponse {"},{"line_number":139,"context_line":"  enum Action {"},{"line_number":140,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":141,"context_line":"    LIVE_MIGRATE \u003d 1;"},{"line_number":142,"context_line":"    SOFT_SHUTDOWN \u003d 2;"},{"line_number":143,"context_line":"  }"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"b5fd82f0_5eec2842","line":140,"range":{"start_line":140,"start_character":4,"end_line":140,"end_character":11},"updated":"2021-06-17 09:29:30.000000000","message":"Prefix with ACTION_.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":137,"context_line":""},{"line_number":138,"context_line":"message EnsureMigrationTargetResponse {"},{"line_number":139,"context_line":"  enum Action {"},{"line_number":140,"context_line":"    UNKNOWN \u003d 0;"},{"line_number":141,"context_line":"    LIVE_MIGRATE \u003d 1;"},{"line_number":142,"context_line":"    SOFT_SHUTDOWN \u003d 2;"},{"line_number":143,"context_line":"  }"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"5fdc3c27_61b9449f","line":140,"range":{"start_line":140,"start_character":4,"end_line":140,"end_character":11},"in_reply_to":"b5fd82f0_5eec2842","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":142,"context_line":"    SOFT_SHUTDOWN \u003d 2;"},{"line_number":143,"context_line":"  }"},{"line_number":144,"context_line":"  Action action \u003d 1;"},{"line_number":145,"context_line":"  // Endpoint of the new Pod exposing a metropolis.vm.Hypervisor service."},{"line_number":146,"context_line":"  string target_endpoint \u003d 2;"},{"line_number":147,"context_line":"}"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"26099b4b_52b2d0c7","line":145,"range":{"start_line":145,"start_character":65,"end_line":145,"end_character":72},"updated":"2021-06-17 09:29:30.000000000","message":"... if action \u003d\u003d ACTION_LIVE_MIGRATE.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":142,"context_line":"    SOFT_SHUTDOWN \u003d 2;"},{"line_number":143,"context_line":"  }"},{"line_number":144,"context_line":"  Action action \u003d 1;"},{"line_number":145,"context_line":"  // Endpoint of the new Pod exposing a metropolis.vm.Hypervisor service."},{"line_number":146,"context_line":"  string target_endpoint \u003d 2;"},{"line_number":147,"context_line":"}"},{"line_number":148,"context_line":""}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"7d009c3e_c4350e50","line":145,"range":{"start_line":145,"start_character":65,"end_line":145,"end_character":72},"in_reply_to":"26099b4b_52b2d0c7","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":149,"context_line":"// The VMController service is exposed by the controller for the hypervisors to"},{"line_number":150,"context_line":"// interact with. It is responsible for (pseudo)-leases and and migrations."},{"line_number":151,"context_line":"// A typical migration looks like this:"},{"line_number":152,"context_line":"// 1. Currently running pod with VM gets SIGTERM"},{"line_number":153,"context_line":"// 2. Source pod runs EnsureMigrationTarget to inform the controller of its wish"},{"line_number":154,"context_line":"//    to migrate its VM away. The controller creates or reuses a target pod to"},{"line_number":155,"context_line":"//    migrate to and returns its endpoint to the source pod."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"0bcc40c3_22fff73d","line":152,"range":{"start_line":152,"start_character":41,"end_line":152,"end_character":48},"updated":"2021-06-17 09:29:30.000000000","message":"nit: period.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":149,"context_line":"// The VMController service is exposed by the controller for the hypervisors to"},{"line_number":150,"context_line":"// interact with. It is responsible for (pseudo)-leases and and migrations."},{"line_number":151,"context_line":"// A typical migration looks like this:"},{"line_number":152,"context_line":"// 1. Currently running pod with VM gets SIGTERM"},{"line_number":153,"context_line":"// 2. Source pod runs EnsureMigrationTarget to inform the controller of its wish"},{"line_number":154,"context_line":"//    to migrate its VM away. The controller creates or reuses a target pod to"},{"line_number":155,"context_line":"//    migrate to and returns its endpoint to the source pod."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"9957e3fa_c8e9d9dc","line":152,"range":{"start_line":152,"start_character":41,"end_line":152,"end_character":48},"in_reply_to":"0bcc40c3_22fff73d","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":151,"context_line":"// A typical migration looks like this:"},{"line_number":152,"context_line":"// 1. Currently running pod with VM gets SIGTERM"},{"line_number":153,"context_line":"// 2. Source pod runs EnsureMigrationTarget to inform the controller of its wish"},{"line_number":154,"context_line":"//    to migrate its VM away. The controller creates or reuses a target pod to"},{"line_number":155,"context_line":"//    migrate to and returns its endpoint to the source pod."},{"line_number":156,"context_line":"// 3. Source pod runs Hypervisor.StartMigration on the target pod to negotiate a"},{"line_number":157,"context_line":"//    channel to migrate."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"50dac477_1a59104c","line":154,"range":{"start_line":154,"start_character":45,"end_line":154,"end_character":52},"updated":"2021-06-17 09:29:30.000000000","message":"Does it wait for the target pod to be Running?","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"29387f9966d6092f23d729a7c3bb1f519cb739f1","unresolved":false,"context_lines":[{"line_number":151,"context_line":"// A typical migration looks like this:"},{"line_number":152,"context_line":"// 1. Currently running pod with VM gets SIGTERM"},{"line_number":153,"context_line":"// 2. Source pod runs EnsureMigrationTarget to inform the controller of its wish"},{"line_number":154,"context_line":"//    to migrate its VM away. The controller creates or reuses a target pod to"},{"line_number":155,"context_line":"//    migrate to and returns its endpoint to the source pod."},{"line_number":156,"context_line":"// 3. Source pod runs Hypervisor.StartMigration on the target pod to negotiate a"},{"line_number":157,"context_line":"//    channel to migrate."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"81f82325_a571af43","line":154,"range":{"start_line":154,"start_character":45,"end_line":154,"end_character":52},"in_reply_to":"50dac477_1a59104c","updated":"2021-06-21 14:18:30.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":161,"context_line":"//    to itself and `them` to the `us` parameter in the StartMigrationRequest it"},{"line_number":162,"context_line":"//    received in step 3."},{"line_number":163,"context_line":"// 6. The controller performs the Compare-and-Swap and returns either Ok or"},{"line_number":164,"context_line":"//    PreconditionFailed depending on weather the authoritative pod has changed"},{"line_number":165,"context_line":"//    in the meantime. If the MigrationSwitchover RPC succeeded, the VM is now"},{"line_number":166,"context_line":"//    running on the target pod. If it doesn\u0027t succeed, the target pod will"},{"line_number":167,"context_line":"//    retry for a set period of time and then exit."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"000bab90_e00dd94b","line":164,"range":{"start_line":164,"start_character":38,"end_line":164,"end_character":45},"updated":"2021-06-17 09:29:30.000000000","message":"whether","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":161,"context_line":"//    to itself and `them` to the `us` parameter in the StartMigrationRequest it"},{"line_number":162,"context_line":"//    received in step 3."},{"line_number":163,"context_line":"// 6. The controller performs the Compare-and-Swap and returns either Ok or"},{"line_number":164,"context_line":"//    PreconditionFailed depending on weather the authoritative pod has changed"},{"line_number":165,"context_line":"//    in the meantime. If the MigrationSwitchover RPC succeeded, the VM is now"},{"line_number":166,"context_line":"//    running on the target pod. If it doesn\u0027t succeed, the target pod will"},{"line_number":167,"context_line":"//    retry for a set period of time and then exit."}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"d47c97c6_ae62b5c1","line":164,"range":{"start_line":164,"start_character":38,"end_line":164,"end_character":45},"in_reply_to":"000bab90_e00dd94b","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":164,"context_line":"//    PreconditionFailed depending on weather the authoritative pod has changed"},{"line_number":165,"context_line":"//    in the meantime. If the MigrationSwitchover RPC succeeded, the VM is now"},{"line_number":166,"context_line":"//    running on the target pod. If it doesn\u0027t succeed, the target pod will"},{"line_number":167,"context_line":"//    retry for a set period of time and then exit."},{"line_number":168,"context_line":"// 7. After a set timeout, the source pod will regenerate is run id and attempt"},{"line_number":169,"context_line":"//    to call MigrationSwitchover with them set to its old identity and us to"},{"line_number":170,"context_line":"//    its new identity formed by updating its run id. This call is expected to"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"d8e4d30b_408bf2fa","line":167,"range":{"start_line":167,"start_character":6,"end_line":167,"end_character":11},"updated":"2021-06-17 09:29:30.000000000","message":"Retry from which step?","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":false,"context_lines":[{"line_number":164,"context_line":"//    PreconditionFailed depending on weather the authoritative pod has changed"},{"line_number":165,"context_line":"//    in the meantime. If the MigrationSwitchover RPC succeeded, the VM is now"},{"line_number":166,"context_line":"//    running on the target pod. If it doesn\u0027t succeed, the target pod will"},{"line_number":167,"context_line":"//    retry for a set period of time and then exit."},{"line_number":168,"context_line":"// 7. After a set timeout, the source pod will regenerate is run id and attempt"},{"line_number":169,"context_line":"//    to call MigrationSwitchover with them set to its old identity and us to"},{"line_number":170,"context_line":"//    its new identity formed by updating its run id. This call is expected to"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"4fc18a8f_c598c306","line":167,"range":{"start_line":167,"start_character":6,"end_line":167,"end_character":11},"in_reply_to":"d8e4d30b_408bf2fa","updated":"2021-06-21 11:18:53.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":175,"context_line":"  // EnsureMigrationTarget returns either a request to soft-shutdown or a"},{"line_number":176,"context_line":"  // reference to a pod to which the caller should connect to migrate the VM."},{"line_number":177,"context_line":"  rpc EnsureMigrationTarget(EnsureMigrationTargetRequest)"},{"line_number":178,"context_line":"      returns (EnsureMigrationTargetResponse);"},{"line_number":179,"context_line":"  // MigrationSwitchover attempts to atomically swap the authoritative Pod and"},{"line_number":180,"context_line":"  // PVC from the one in `them` to the one in `us`. If this request succeeds the"},{"line_number":181,"context_line":"  // pod in `us` (the caller) is now authoritative for a given VM. If the"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"8e56cbb9_0b74fec6","line":178,"range":{"start_line":178,"start_character":6,"end_line":178,"end_character":46},"updated":"2021-06-17 09:29:30.000000000","message":"nit: Why the hard wrap here?","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"864f3d12f3ef89a05743411848992e17381fc863","unresolved":false,"context_lines":[{"line_number":175,"context_line":"  // EnsureMigrationTarget returns either a request to soft-shutdown or a"},{"line_number":176,"context_line":"  // reference to a pod to which the caller should connect to migrate the VM."},{"line_number":177,"context_line":"  rpc EnsureMigrationTarget(EnsureMigrationTargetRequest)"},{"line_number":178,"context_line":"      returns (EnsureMigrationTargetResponse);"},{"line_number":179,"context_line":"  // MigrationSwitchover attempts to atomically swap the authoritative Pod and"},{"line_number":180,"context_line":"  // PVC from the one in `them` to the one in `us`. If this request succeeds the"},{"line_number":181,"context_line":"  // pod in `us` (the caller) is now authoritative for a given VM. If the"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"d039ba6f_19597102","line":178,"range":{"start_line":178,"start_character":6,"end_line":178,"end_character":46},"in_reply_to":"58d19746_a5827fbb","updated":"2021-06-21 15:28:56.000000000","message":"Done","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"f2971d6c1e2ff307da81954de8753e57b1576c71","unresolved":true,"context_lines":[{"line_number":175,"context_line":"  // EnsureMigrationTarget returns either a request to soft-shutdown or a"},{"line_number":176,"context_line":"  // reference to a pod to which the caller should connect to migrate the VM."},{"line_number":177,"context_line":"  rpc EnsureMigrationTarget(EnsureMigrationTargetRequest)"},{"line_number":178,"context_line":"      returns (EnsureMigrationTargetResponse);"},{"line_number":179,"context_line":"  // MigrationSwitchover attempts to atomically swap the authoritative Pod and"},{"line_number":180,"context_line":"  // PVC from the one in `them` to the one in `us`. If this request succeeds the"},{"line_number":181,"context_line":"  // pod in `us` (the caller) is now authoritative for a given VM. If the"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"58d19746_a5827fbb","line":178,"range":{"start_line":178,"start_character":6,"end_line":178,"end_character":46},"in_reply_to":"7906a069_65913e4f","updated":"2021-06-21 14:52:16.000000000","message":"But we don\u0027t mandate wrapping code at 80 characters (only comments, and technically only in Go), and this is less legible than if it was not wrapped.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":true,"context_lines":[{"line_number":175,"context_line":"  // EnsureMigrationTarget returns either a request to soft-shutdown or a"},{"line_number":176,"context_line":"  // reference to a pod to which the caller should connect to migrate the VM."},{"line_number":177,"context_line":"  rpc EnsureMigrationTarget(EnsureMigrationTargetRequest)"},{"line_number":178,"context_line":"      returns (EnsureMigrationTargetResponse);"},{"line_number":179,"context_line":"  // MigrationSwitchover attempts to atomically swap the authoritative Pod and"},{"line_number":180,"context_line":"  // PVC from the one in `them` to the one in `us`. If this request succeeds the"},{"line_number":181,"context_line":"  // pod in `us` (the caller) is now authoritative for a given VM. If the"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"7906a069_65913e4f","line":178,"range":{"start_line":178,"start_character":6,"end_line":178,"end_character":46},"in_reply_to":"8e56cbb9_0b74fec6","updated":"2021-06-21 11:18:53.000000000","message":"That\u0027s a direct result of wrapping at 80 characters.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"b0dae37aaf1241d6e8fd5e298431c267ef9da6e4","unresolved":true,"context_lines":[{"line_number":180,"context_line":"  // PVC from the one in `them` to the one in `us`. If this request succeeds the"},{"line_number":181,"context_line":"  // pod in `us` (the caller) is now authoritative for a given VM. If the"},{"line_number":182,"context_line":"  // authoritative pod is not the one in `them`, this method will return"},{"line_number":183,"context_line":"  // PreconditionFailed and do nothing. If this method succeeds any alternative"},{"line_number":184,"context_line":"  // migration targets are garbage-collected."},{"line_number":185,"context_line":"  rpc MigrationSwitchover(MigrationSwitchoverRequest)"},{"line_number":186,"context_line":"      returns (MigrationSwitchoverResponse);"},{"line_number":187,"context_line":"  // RunLease requests a pseudo-lease (or a full lease in LeaseMode"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"a77eebd5_2361e9fe","line":184,"range":{"start_line":183,"start_character":40,"end_line":184,"end_character":45},"updated":"2021-06-17 09:29:30.000000000","message":"What are \u0027alternative migration targets\u0027? How does the controller keep track of them?","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"f2971d6c1e2ff307da81954de8753e57b1576c71","unresolved":false,"context_lines":[{"line_number":180,"context_line":"  // PVC from the one in `them` to the one in `us`. If this request succeeds the"},{"line_number":181,"context_line":"  // pod in `us` (the caller) is now authoritative for a given VM. If the"},{"line_number":182,"context_line":"  // authoritative pod is not the one in `them`, this method will return"},{"line_number":183,"context_line":"  // PreconditionFailed and do nothing. If this method succeeds any alternative"},{"line_number":184,"context_line":"  // migration targets are garbage-collected."},{"line_number":185,"context_line":"  rpc MigrationSwitchover(MigrationSwitchoverRequest)"},{"line_number":186,"context_line":"      returns (MigrationSwitchoverResponse);"},{"line_number":187,"context_line":"  // RunLease requests a pseudo-lease (or a full lease in LeaseMode"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"0d2ac985_863e168d","line":184,"range":{"start_line":183,"start_character":40,"end_line":184,"end_character":45},"in_reply_to":"1d93565f_d4ceb795","updated":"2021-06-21 14:52:16.000000000","message":"Ack","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"152d8b9fe356ff4df4721c319edb4554fe7b64de","unresolved":true,"context_lines":[{"line_number":180,"context_line":"  // PVC from the one in `them` to the one in `us`. If this request succeeds the"},{"line_number":181,"context_line":"  // pod in `us` (the caller) is now authoritative for a given VM. If the"},{"line_number":182,"context_line":"  // authoritative pod is not the one in `them`, this method will return"},{"line_number":183,"context_line":"  // PreconditionFailed and do nothing. If this method succeeds any alternative"},{"line_number":184,"context_line":"  // migration targets are garbage-collected."},{"line_number":185,"context_line":"  rpc MigrationSwitchover(MigrationSwitchoverRequest)"},{"line_number":186,"context_line":"      returns (MigrationSwitchoverResponse);"},{"line_number":187,"context_line":"  // RunLease requests a pseudo-lease (or a full lease in LeaseMode"}],"source_content_type":"text/x-protobuf","patch_set":8,"id":"1d93565f_d4ceb795","line":184,"range":{"start_line":183,"start_character":40,"end_line":184,"end_character":45},"in_reply_to":"a77eebd5_2361e9fe","updated":"2021-06-21 11:18:53.000000000","message":"Candidates for migration created by the controller. There\u0027s at most one of those which is not being actively terminated and it\u0027s tracked as part of the status of the VM object. But it\u0027s an implementation detail of the controller so instead of explaining all the controller logic in this API contract I\u0027ve just dropped that sentence.","commit_id":"eba6442a4888eaaab863e7170c894f468585d55c"},{"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":"f2971d6c1e2ff307da81954de8753e57b1576c71","unresolved":true,"context_lines":[{"line_number":123,"context_line":"// NetworkConfig represents the network configuration the VM needs to configure"},{"line_number":124,"context_line":"// to communicate via its network interface."},{"line_number":125,"context_line":"message NetworkConfig {"},{"line_number":126,"context_line":"  // Currently only a PtP interface with at most one IPv4 and one IPv6 address"},{"line_number":127,"context_line":"  // are supported. Routing more than one IP to a VM can be accomplished later"},{"line_number":128,"context_line":"  // by setting the VM IP in the PTPAddress to a link-local address and routing"},{"line_number":129,"context_line":"  // all IPs to that link-local IP. This would also allow for dynamic routing."},{"line_number":130,"context_line":"  repeated PTPAddress address \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":10,"id":"93a66a87_898ba870","line":127,"range":{"start_line":126,"start_character":36,"end_line":127,"end_character":19},"updated":"2021-06-21 14:52:16.000000000","message":"If we\u0027re not supporting more than one address per protocol, then the message should reflect that IMO:\n\n    // IPv4 network address of VM, if any.\n    PTPAddress v4 \u003d 1;\n    // IPv6 network address of VM, if any.\n    PTPAddress v6 \u003d 1;\n\n(instead of a repeated field)\n\nAlso, how does do these addresses relate to VMSpec.address? There we can have multiple addresses per protocol, and we don\u0027t have a \u0027peer IP\u0027 defined there. How do we transform from possibly multiple addresses per protocol to just one per protocol? Is the peer IP decided by the hypervisor? If so, is it hardcoded or configurable?","commit_id":"00d749aa50574c0b29655fe16d7eff8499144688"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"605a512565cb5e7a8efb077341238f662ed77179","unresolved":false,"context_lines":[{"line_number":123,"context_line":"// NetworkConfig represents the network configuration the VM needs to configure"},{"line_number":124,"context_line":"// to communicate via its network interface."},{"line_number":125,"context_line":"message NetworkConfig {"},{"line_number":126,"context_line":"  // Currently only a PtP interface with at most one IPv4 and one IPv6 address"},{"line_number":127,"context_line":"  // are supported. Routing more than one IP to a VM can be accomplished later"},{"line_number":128,"context_line":"  // by setting the VM IP in the PTPAddress to a link-local address and routing"},{"line_number":129,"context_line":"  // all IPs to that link-local IP. This would also allow for dynamic routing."},{"line_number":130,"context_line":"  repeated PTPAddress address \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":10,"id":"f9e3a0a2_bb8637c2","line":127,"range":{"start_line":126,"start_character":36,"end_line":127,"end_character":19},"in_reply_to":"4e39d0eb_e66a8f45","updated":"2021-06-22 11:00:53.000000000","message":"Ack, let\u0027s go with that.","commit_id":"00d749aa50574c0b29655fe16d7eff8499144688"},{"author":{"_account_id":1000001,"name":"Lorenz Brun","display_name":"Lorenz","email":"lorenz@monogon.tech","username":"lorenz","avatars":[{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/75c04f6e9881c24ee621fba80667eed8.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"864f3d12f3ef89a05743411848992e17381fc863","unresolved":true,"context_lines":[{"line_number":123,"context_line":"// NetworkConfig represents the network configuration the VM needs to configure"},{"line_number":124,"context_line":"// to communicate via its network interface."},{"line_number":125,"context_line":"message NetworkConfig {"},{"line_number":126,"context_line":"  // Currently only a PtP interface with at most one IPv4 and one IPv6 address"},{"line_number":127,"context_line":"  // are supported. Routing more than one IP to a VM can be accomplished later"},{"line_number":128,"context_line":"  // by setting the VM IP in the PTPAddress to a link-local address and routing"},{"line_number":129,"context_line":"  // all IPs to that link-local IP. This would also allow for dynamic routing."},{"line_number":130,"context_line":"  repeated PTPAddress address \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":10,"id":"c7087876_a7759cf6","line":127,"range":{"start_line":126,"start_character":36,"end_line":127,"end_character":19},"in_reply_to":"93a66a87_898ba870","updated":"2021-06-21 15:28:56.000000000","message":"Switching to v4 and v6 fields makes sense as more than one PtP link per IP protocol version is not useful. Adressing for the VM can be done in two ways: Assigning a global IP (i.e. one from VMSpec.address) to the VM and a link-local one to `peer_ip` for only one IP per protocol and VM. Alternatively the VM can be assigned a link-local IP too and we just route all traffic for everything in VMSpec.address to that IP. This allows for an arbitrary amount of IPs and subnets but requires more setup on the VM (because the IPs need to be configured somewhere, otherwise they don\u0027t work) and will probably be broken on Windows.\nA trivial solution would use the first addressing mode if there\u0027s a maximum of one IP per protocol and the second one otherwise. The other option is forcing link-local IPs anyways and having the guest agent configure all IPs onto the link-local interface. But this behavior would need to be controllable as most uses of routing an entire subnet or multiple IPs onto a VM will involve networking within that VM and thus we shouldn\u0027t just assign everything to the loopback interface.\nOr we could just (at least for the time being) reject everything that contains more than one IP per IP protocol version.","commit_id":"00d749aa50574c0b29655fe16d7eff8499144688"},{"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":"ac8cd1486f83f23a590ed89653874977001bb25f","unresolved":true,"context_lines":[{"line_number":123,"context_line":"// NetworkConfig represents the network configuration the VM needs to configure"},{"line_number":124,"context_line":"// to communicate via its network interface."},{"line_number":125,"context_line":"message NetworkConfig {"},{"line_number":126,"context_line":"  // Currently only a PtP interface with at most one IPv4 and one IPv6 address"},{"line_number":127,"context_line":"  // are supported. Routing more than one IP to a VM can be accomplished later"},{"line_number":128,"context_line":"  // by setting the VM IP in the PTPAddress to a link-local address and routing"},{"line_number":129,"context_line":"  // all IPs to that link-local IP. This would also allow for dynamic routing."},{"line_number":130,"context_line":"  repeated PTPAddress address \u003d 1;"}],"source_content_type":"text/x-protobuf","patch_set":10,"id":"4e39d0eb_e66a8f45","line":127,"range":{"start_line":126,"start_character":36,"end_line":127,"end_character":19},"in_reply_to":"c7087876_a7759cf6","updated":"2021-06-22 10:51:36.000000000","message":"Let\u0027s go with limiting each VM to a single IP address per protocol (I assume that involves making the controller will fail to act on any VM object that breaks this assumption and log a relevant event - and that needs to be documented somewhere).\n\nLater on when we need multiple addresses per protocol the NetworkConfig can be extended to support some thing like \u0027extra_address\u0027 that will be explicitly stated as being routed through one of the ptp addresses. The guest network stack can then just follow whatever low-level orders are specified in NetworkConfig, while we keep the VM object spec (and VMSpec proto message) high level.","commit_id":"00d749aa50574c0b29655fe16d7eff8499144688"}]}
