)]}'
{"/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":"288c2a8e52f700b85bb0c384311d41ee912f7a91","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":3,"id":"a45932e8_f77ab92b","updated":"2022-12-06 12:48:40.000000000","message":"Sorry for taking this long on this.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[],"source_content_type":"","patch_set":4,"id":"435768f1_6f684132","updated":"2023-01-12 19:42:49.000000000","message":"This could be further split up into multiple CRs: one for Provisioner, another for Initializer, and key management, however I\u0027m going to leave it at that due to timing constraints. The bulk of this CR was refactored to fit the style-related comments.","commit_id":"f1bbffecb2d6c4f42e39a5d3c820b5e2c52b8767"}],"cloud/shepherd/equinix/manager/manager.go":[{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"581ebf54f43938db8200a3272e5977e457c2c798","unresolved":true,"context_lines":[{"line_number":15,"context_line":"// The terms \"device\", \"machine\", and \"server\" are used interchangeably"},{"line_number":16,"context_line":"// throughout this package due to differences in Equinix Metal and BMDB"},{"line_number":17,"context_line":"// nomenclature."},{"line_number":18,"context_line":"package manager"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import ("},{"line_number":21,"context_line":"\t\"bufio\""}],"source_content_type":"text/x-go","patch_set":3,"id":"78e4c0d7_2d43881e","line":18,"updated":"2022-11-30 18:09:04.000000000","message":"How should I call it? I wrote this assuming \"Shepherd\" would describe the whole component BMaaS component responsible for lifecycle management, not particular provider interfaces.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":15,"context_line":"// The terms \"device\", \"machine\", and \"server\" are used interchangeably"},{"line_number":16,"context_line":"// throughout this package due to differences in Equinix Metal and BMDB"},{"line_number":17,"context_line":"// nomenclature."},{"line_number":18,"context_line":"package manager"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import ("},{"line_number":21,"context_line":"\t\"bufio\""}],"source_content_type":"text/x-go","patch_set":3,"id":"f8392dfb_511f7aec","line":18,"in_reply_to":"01e92ba2_98c00755","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":15,"context_line":"// The terms \"device\", \"machine\", and \"server\" are used interchangeably"},{"line_number":16,"context_line":"// throughout this package due to differences in Equinix Metal and BMDB"},{"line_number":17,"context_line":"// nomenclature."},{"line_number":18,"context_line":"package manager"},{"line_number":19,"context_line":""},{"line_number":20,"context_line":"import ("},{"line_number":21,"context_line":"\t\"bufio\""}],"source_content_type":"text/x-go","patch_set":3,"id":"01e92ba2_98c00755","line":18,"in_reply_to":"78e4c0d7_2d43881e","updated":"2022-12-06 12:48:31.000000000","message":"This is fine.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":48,"context_line":"// ManagerOpts aggregates options required to build Manager instances. Some"},{"line_number":49,"context_line":"// of the options included can be left unspecified, in which case they will"},{"line_number":50,"context_line":"// be substituted with defaults. See: New."},{"line_number":51,"context_line":"type ManagerOpts struct {"},{"line_number":52,"context_line":"\t// ProjectUUID is the Equinix project ID used by the manager. See Equinix API"},{"line_number":53,"context_line":"\t// documentation for details."},{"line_number":54,"context_line":"\tProjectUUID string"}],"source_content_type":"text/x-go","patch_set":3,"id":"fc4360ff_0dd5d6a6","line":51,"updated":"2022-12-06 12:48:31.000000000","message":"Stutter (manager.ManagerOpts), just call it Opts/Options. Or Config, as that what\u0027s we name these structs elsewhere.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":48,"context_line":"// ManagerOpts aggregates options required to build Manager instances. Some"},{"line_number":49,"context_line":"// of the options included can be left unspecified, in which case they will"},{"line_number":50,"context_line":"// be substituted with defaults. See: New."},{"line_number":51,"context_line":"type ManagerOpts struct {"},{"line_number":52,"context_line":"\t// ProjectUUID is the Equinix project ID used by the manager. See Equinix API"},{"line_number":53,"context_line":"\t// documentation for details."},{"line_number":54,"context_line":"\tProjectUUID string"}],"source_content_type":"text/x-go","patch_set":3,"id":"4a9a47a2_0b263c65","line":51,"in_reply_to":"fc4360ff_0dd5d6a6","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":65,"context_line":"\tSSHKeyLabel string"},{"line_number":66,"context_line":"\t// SSHKeyDir should point to the directory this implementation will use to"},{"line_number":67,"context_line":"\t// store and recover generated SSH keys."},{"line_number":68,"context_line":"\tSSHKeyDir string"},{"line_number":69,"context_line":"\t// SSHUsername is used when logging into newly created servers."},{"line_number":70,"context_line":"\tSSHUsername string"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"3616787b_263c81f8","line":68,"range":{"start_line":68,"start_character":1,"end_line":68,"end_character":10},"updated":"2022-12-06 12:48:31.000000000","message":"I think this \u0027library\u0027 code should accept the ssh key as an in-memory []byte. This will make this code and test code easier. The library-as-wrapped-in-a-program should then take care of boring things like reading files from disk, generating a key if missing, etc.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":65,"context_line":"\tSSHKeyLabel string"},{"line_number":66,"context_line":"\t// SSHKeyDir should point to the directory this implementation will use to"},{"line_number":67,"context_line":"\t// store and recover generated SSH keys."},{"line_number":68,"context_line":"\tSSHKeyDir string"},{"line_number":69,"context_line":"\t// SSHUsername is used when logging into newly created servers."},{"line_number":70,"context_line":"\tSSHUsername string"},{"line_number":71,"context_line":""}],"source_content_type":"text/x-go","patch_set":3,"id":"ebae41d6_3504264c","line":68,"range":{"start_line":68,"start_character":1,"end_line":68,"end_character":10},"in_reply_to":"3616787b_263c81f8","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":85,"context_line":"\t// AgentExecutablePath is a filesystem path pointing at BMaaS agent"},{"line_number":86,"context_line":"\t// executable that will be uploaded and ran on new hosts as part of the"},{"line_number":87,"context_line":"\t// initialization process."},{"line_number":88,"context_line":"\tAgentExecutablePath string"},{"line_number":89,"context_line":"\t// AgentTargetPath is a destination path used while uploading the BMaaS agent"},{"line_number":90,"context_line":"\t// executable to hosts as part of the initialization process."},{"line_number":91,"context_line":"\tAgentTargetPath string"}],"source_content_type":"text/x-go","patch_set":3,"id":"394a2b41_17a2f158","line":88,"range":{"start_line":88,"start_character":1,"end_line":88,"end_character":6},"updated":"2022-12-06 12:48:31.000000000","message":"style nit: For all these sub-configs (AgentXXX, SSHXXX, OnXXX) you can factor them out to sub-structures instead of keeping things flat. You can then also move some of the functionality to be methods on these structures instead of on Manager, and that in turn might make things easier to test (as you don\u0027t have to mock the entire structure anymore).","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":85,"context_line":"\t// AgentExecutablePath is a filesystem path pointing at BMaaS agent"},{"line_number":86,"context_line":"\t// executable that will be uploaded and ran on new hosts as part of the"},{"line_number":87,"context_line":"\t// initialization process."},{"line_number":88,"context_line":"\tAgentExecutablePath string"},{"line_number":89,"context_line":"\t// AgentTargetPath is a destination path used while uploading the BMaaS agent"},{"line_number":90,"context_line":"\t// executable to hosts as part of the initialization process."},{"line_number":91,"context_line":"\tAgentTargetPath string"}],"source_content_type":"text/x-go","patch_set":3,"id":"cde6123a_fe4d1e2a","line":88,"range":{"start_line":88,"start_character":1,"end_line":88,"end_character":6},"in_reply_to":"394a2b41_17a2f158","updated":"2023-01-12 19:42:49.000000000","message":"Done - please look for these in their separate files.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"\t// OnDeviceProvided is a callback function called at the point when a device"},{"line_number":128,"context_line":"\t// was just provisioned at Equinix, but is not yet active (accepting SSH"},{"line_number":129,"context_line":"\t// connections). It can be left nil. Callbacks are executed synchronously."},{"line_number":130,"context_line":"\tOnDeviceProvided func(packngo.Device)"},{"line_number":131,"context_line":"\t// OnDeviceActive is a callback function called at the time when the"},{"line_number":132,"context_line":"\t// provisioning process at Equinix has just concluded. This translates to"}],"source_content_type":"text/x-go","patch_set":3,"id":"b82b1b05_a98f32a8","line":129,"range":{"start_line":129,"start_character":61,"end_line":129,"end_character":74},"updated":"2022-12-06 12:48:31.000000000","message":"`... and thus shouldn\u0027t block`?","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":126,"context_line":""},{"line_number":127,"context_line":"\t// OnDeviceProvided is a callback function called at the point when a device"},{"line_number":128,"context_line":"\t// was just provisioned at Equinix, but is not yet active (accepting SSH"},{"line_number":129,"context_line":"\t// connections). It can be left nil. Callbacks are executed synchronously."},{"line_number":130,"context_line":"\tOnDeviceProvided func(packngo.Device)"},{"line_number":131,"context_line":"\t// OnDeviceActive is a callback function called at the time when the"},{"line_number":132,"context_line":"\t// provisioning process at Equinix has just concluded. This translates to"}],"source_content_type":"text/x-go","patch_set":3,"id":"05fe6874_5ba4ed9d","line":129,"range":{"start_line":129,"start_character":61,"end_line":129,"end_character":74},"in_reply_to":"b82b1b05_a98f32a8","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":150,"context_line":"\t// o stores initial governor configuration."},{"line_number":151,"context_line":"\to *ManagerOpts"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"\t// sshKeyPath is a filesystem path poiting at the ED25519 key file currently"},{"line_number":154,"context_line":"\t// in use."},{"line_number":155,"context_line":"\tsshKeyPath string"},{"line_number":156,"context_line":"\t// sshPubKey is the currently used SSH public key string expressed in OpenSSH"}],"source_content_type":"text/x-go","patch_set":3,"id":"0f0b60c2_acc0e26d","line":153,"range":{"start_line":153,"start_character":36,"end_line":153,"end_character":43},"updated":"2022-12-06 12:48:31.000000000","message":"pointing","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":150,"context_line":"\t// o stores initial governor configuration."},{"line_number":151,"context_line":"\to *ManagerOpts"},{"line_number":152,"context_line":""},{"line_number":153,"context_line":"\t// sshKeyPath is a filesystem path poiting at the ED25519 key file currently"},{"line_number":154,"context_line":"\t// in use."},{"line_number":155,"context_line":"\tsshKeyPath string"},{"line_number":156,"context_line":"\t// sshPubKey is the currently used SSH public key string expressed in OpenSSH"}],"source_content_type":"text/x-go","patch_set":3,"id":"0658f925_c086831b","line":153,"range":{"start_line":153,"start_character":36,"end_line":153,"end_character":43},"in_reply_to":"0f0b60c2_acc0e26d","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":168,"context_line":"\t// failure."},{"line_number":169,"context_line":"\tdbc *bmdb.Connection"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"\t// agentState maps device provider IDs to information on both initialization"},{"line_number":172,"context_line":"\t// and recovery processes. It\u0027s purpose is to synchronize both types of"},{"line_number":173,"context_line":"\t// worker goroutines. See: *Manager.Run."},{"line_number":174,"context_line":"\tagentState sync.Map"}],"source_content_type":"text/x-go","patch_set":3,"id":"a7480a00_b59d26f0","line":171,"updated":"2022-12-06 12:48:31.000000000","message":"Explicitly spell out the key/value types here. Or use the opportunity to wrap sync.Map in some typed wrapper using type parameters.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":168,"context_line":"\t// failure."},{"line_number":169,"context_line":"\tdbc *bmdb.Connection"},{"line_number":170,"context_line":""},{"line_number":171,"context_line":"\t// agentState maps device provider IDs to information on both initialization"},{"line_number":172,"context_line":"\t// and recovery processes. It\u0027s purpose is to synchronize both types of"},{"line_number":173,"context_line":"\t// worker goroutines. See: *Manager.Run."},{"line_number":174,"context_line":"\tagentState sync.Map"}],"source_content_type":"text/x-go","patch_set":3,"id":"a82d3973_e0bfc126","line":171,"in_reply_to":"a7480a00_b59d26f0","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"\t// deviceCreationLimiter limits the rate at which this implementation creates"},{"line_number":177,"context_line":"\t// devices at Equinix through calls to cl.CreateDevice."},{"line_number":178,"context_line":"\tdeviceCreationLimiter *time.Ticker"},{"line_number":179,"context_line":"\t// reservationQueryLimiter limits the rate at which Equinix API is queried"},{"line_number":180,"context_line":"\t// for information on available Hardware Reservations."},{"line_number":181,"context_line":"\treservationQueryLimiter *time.Ticker"}],"source_content_type":"text/x-go","patch_set":3,"id":"4755b405_e6bb4e6b","line":178,"range":{"start_line":178,"start_character":24,"end_line":178,"end_character":35},"updated":"2022-12-06 12:48:31.000000000","message":"For all your rate limiting purposes, you might want to investigate golang.org/x/time/rate, which implements a \u0027token bucket\u0027 based limiter. That\u0027s generally a better limiting approach than a plain ticker and is the most commonly used rate limiting mechanism in production systems.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":175,"context_line":""},{"line_number":176,"context_line":"\t// deviceCreationLimiter limits the rate at which this implementation creates"},{"line_number":177,"context_line":"\t// devices at Equinix through calls to cl.CreateDevice."},{"line_number":178,"context_line":"\tdeviceCreationLimiter *time.Ticker"},{"line_number":179,"context_line":"\t// reservationQueryLimiter limits the rate at which Equinix API is queried"},{"line_number":180,"context_line":"\t// for information on available Hardware Reservations."},{"line_number":181,"context_line":"\treservationQueryLimiter *time.Ticker"}],"source_content_type":"text/x-go","patch_set":3,"id":"d23723e3_fc16b7a7","line":178,"range":{"start_line":178,"start_character":24,"end_line":178,"end_character":35},"in_reply_to":"4755b405_e6bb4e6b","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":186,"context_line":"\t// pending recovery."},{"line_number":187,"context_line":"\trecoveryQueryLimiter *time.Ticker"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"\t// cblk synchronizes access to user-defined callbacks provided through"},{"line_number":190,"context_line":"\t// ManagerOpts."},{"line_number":191,"context_line":"\tcblk sync.Mutex"},{"line_number":192,"context_line":"}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"// agentState keeps node-specific information on agent initialization, as well"}],"source_content_type":"text/x-go","patch_set":3,"id":"cf26286c_ca58276d","line":191,"range":{"start_line":189,"start_character":1,"end_line":191,"end_character":16},"updated":"2022-12-06 12:48:31.000000000","message":"I don\u0027t think it\u0027s the responsibility of this library to do this synchronization. Let the user take care of that, considering some users might actually be okay with concurrent calls.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":186,"context_line":"\t// pending recovery."},{"line_number":187,"context_line":"\trecoveryQueryLimiter *time.Ticker"},{"line_number":188,"context_line":""},{"line_number":189,"context_line":"\t// cblk synchronizes access to user-defined callbacks provided through"},{"line_number":190,"context_line":"\t// ManagerOpts."},{"line_number":191,"context_line":"\tcblk sync.Mutex"},{"line_number":192,"context_line":"}"},{"line_number":193,"context_line":""},{"line_number":194,"context_line":"// agentState keeps node-specific information on agent initialization, as well"}],"source_content_type":"text/x-go","patch_set":3,"id":"3933f169_c936ff34","line":191,"range":{"start_line":189,"start_character":1,"end_line":191,"end_character":16},"in_reply_to":"cf26286c_ca58276d","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":308,"context_line":"\tni :\u003d d.GetNetworkInfo()"},{"line_number":309,"context_line":"\tvar addr string"},{"line_number":310,"context_line":"\tif ni.PublicIPv6 !\u003d \"\" {"},{"line_number":311,"context_line":"\t\taddr \u003d fmt.Sprintf(\"[%s]:22\", ni.PublicIPv6)"},{"line_number":312,"context_line":"\t} else if ni.PublicIPv4 !\u003d \"\" {"},{"line_number":313,"context_line":"\t\taddr \u003d fmt.Sprintf(\"%s:22\", ni.PublicIPv4)"},{"line_number":314,"context_line":"\t} else {"}],"source_content_type":"text/x-go","patch_set":3,"id":"9ed0e9e0_7ae076da","line":311,"range":{"start_line":311,"start_character":9,"end_line":311,"end_character":20},"updated":"2022-12-06 12:48:31.000000000","message":"net.JoinHostPort","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":308,"context_line":"\tni :\u003d d.GetNetworkInfo()"},{"line_number":309,"context_line":"\tvar addr string"},{"line_number":310,"context_line":"\tif ni.PublicIPv6 !\u003d \"\" {"},{"line_number":311,"context_line":"\t\taddr \u003d fmt.Sprintf(\"[%s]:22\", ni.PublicIPv6)"},{"line_number":312,"context_line":"\t} else if ni.PublicIPv4 !\u003d \"\" {"},{"line_number":313,"context_line":"\t\taddr \u003d fmt.Sprintf(\"%s:22\", ni.PublicIPv4)"},{"line_number":314,"context_line":"\t} else {"}],"source_content_type":"text/x-go","patch_set":3,"id":"d9c2f3bb_969f5e7d","line":311,"range":{"start_line":311,"start_character":9,"end_line":311,"end_character":20},"in_reply_to":"9ed0e9e0_7ae076da","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":384,"context_line":"\t\tfor {"},{"line_number":385,"context_line":"\t\t\tselect {"},{"line_number":386,"context_line":"\t\t\tcase outs :\u003d \u003c-outsC:"},{"line_number":387,"context_line":"\t\t\t\tklog.Infof(\"SSH out \u003c- (provider ID: %s): %s\", d.ID, outs)"},{"line_number":388,"context_line":"\t\t\t\tif strings.Contains(outs, e.o.AgentPrompt) {"},{"line_number":389,"context_line":"\t\t\t\t\tstarted \u003d true"},{"line_number":390,"context_line":"\t\t\t\t\tif err :\u003d sess.Close(); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"a35b2d88_847e5b72","line":387,"range":{"start_line":387,"start_character":47,"end_line":387,"end_character":48},"updated":"2022-12-06 12:48:31.000000000","message":"%q in case the line received is weird (eg. contains \\r or other unprintable characters).\n\n(same below)","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":384,"context_line":"\t\tfor {"},{"line_number":385,"context_line":"\t\t\tselect {"},{"line_number":386,"context_line":"\t\t\tcase outs :\u003d \u003c-outsC:"},{"line_number":387,"context_line":"\t\t\t\tklog.Infof(\"SSH out \u003c- (provider ID: %s): %s\", d.ID, outs)"},{"line_number":388,"context_line":"\t\t\t\tif strings.Contains(outs, e.o.AgentPrompt) {"},{"line_number":389,"context_line":"\t\t\t\t\tstarted \u003d true"},{"line_number":390,"context_line":"\t\t\t\t\tif err :\u003d sess.Close(); err !\u003d nil {"}],"source_content_type":"text/x-go","patch_set":3,"id":"a490d707_e7211e04","line":387,"range":{"start_line":387,"start_character":47,"end_line":387,"end_character":48},"in_reply_to":"a35b2d88_847e5b72","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":389,"context_line":"\t\t\t\t\tstarted \u003d true"},{"line_number":390,"context_line":"\t\t\t\t\tif err :\u003d sess.Close(); err !\u003d nil {"},{"line_number":391,"context_line":"\t\t\t\t\t\treturn fmt.Errorf(\"while closing SSH session: %v\", err)"},{"line_number":392,"context_line":"\t\t\t\t\t}"},{"line_number":393,"context_line":"\t\t\t\t}"},{"line_number":394,"context_line":"\t\t\tcase errs :\u003d \u003c-errsC:"},{"line_number":395,"context_line":"\t\t\t\tklog.Errorf(\"SSH err \u003c- (provider ID: %s): %s\", d.ID, errs)"}],"source_content_type":"text/x-go","patch_set":3,"id":"5185a7bb_c6ddaea3","line":392,"range":{"start_line":392,"start_character":5,"end_line":392,"end_character":6},"updated":"2022-12-06 12:48:31.000000000","message":"Don\u0027t you want to exit the goroutine/group here now somehow? Otherwise it looks like we will always wait for the timeout to elapse, even if we know the agent started already.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":389,"context_line":"\t\t\t\t\tstarted \u003d true"},{"line_number":390,"context_line":"\t\t\t\t\tif err :\u003d sess.Close(); err !\u003d nil {"},{"line_number":391,"context_line":"\t\t\t\t\t\treturn fmt.Errorf(\"while closing SSH session: %v\", err)"},{"line_number":392,"context_line":"\t\t\t\t\t}"},{"line_number":393,"context_line":"\t\t\t\t}"},{"line_number":394,"context_line":"\t\t\tcase errs :\u003d \u003c-errsC:"},{"line_number":395,"context_line":"\t\t\t\tklog.Errorf(\"SSH err \u003c- (provider ID: %s): %s\", d.ID, errs)"}],"source_content_type":"text/x-go","patch_set":3,"id":"f08a548f_6bd68e40","line":392,"range":{"start_line":392,"start_character":5,"end_line":392,"end_character":6},"in_reply_to":"5185a7bb_c6ddaea3","updated":"2023-01-12 19:42:49.000000000","message":"We won\u0027t, as:\n1) any goroutine returning an error will cause errgroup to cancel its context. See: https://pkg.go.dev/golang.org/x/sync/errgroup\n2) sess being closed on success will trigger these errors.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":432,"context_line":"func canonicalDeviceID(ctx context.Context, sess *bmdb.Session, pid string) (*uuid.UUID, error) {"},{"line_number":433,"context_line":"\tvar mpid uuid.UUID"},{"line_number":434,"context_line":"\tvar err error"},{"line_number":435,"context_line":"\t_ \u003d sess.Transact(ctx, func(q *model.Queries) error {"},{"line_number":436,"context_line":"\t\trp :\u003d model.MachineGetCanonicalIDParams{"},{"line_number":437,"context_line":"\t\t\tProvider:   model.ProviderEquinix,"},{"line_number":438,"context_line":"\t\t\tProviderID: pid,"}],"source_content_type":"text/x-go","patch_set":3,"id":"28df822e_14f3a414","line":435,"range":{"start_line":435,"start_character":1,"end_line":435,"end_character":4},"updated":"2022-12-06 12:48:31.000000000","message":"err :\u003d\n\n(otherwise you might end up interpreting an error from a previous retry of the query within the transaction)","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":432,"context_line":"func canonicalDeviceID(ctx context.Context, sess *bmdb.Session, pid string) (*uuid.UUID, error) {"},{"line_number":433,"context_line":"\tvar mpid uuid.UUID"},{"line_number":434,"context_line":"\tvar err error"},{"line_number":435,"context_line":"\t_ \u003d sess.Transact(ctx, func(q *model.Queries) error {"},{"line_number":436,"context_line":"\t\trp :\u003d model.MachineGetCanonicalIDParams{"},{"line_number":437,"context_line":"\t\t\tProvider:   model.ProviderEquinix,"},{"line_number":438,"context_line":"\t\t\tProviderID: pid,"}],"source_content_type":"text/x-go","patch_set":3,"id":"f421ac2f_0cf0ea4c","line":435,"range":{"start_line":435,"start_character":1,"end_line":435,"end_character":4},"in_reply_to":"28df822e_14f3a414","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":478,"context_line":"\tif ast.inRetries \u003e e.o.AgentInitRetries {"},{"line_number":479,"context_line":"\t\tklog.Warningf(\"Could not start the agent - deprovisioning... (provider ID: %s)\", aid.ID)"},{"line_number":480,"context_line":"\t\t// TODO(mateusz@monogon.tech): delete the device in BMDB."},{"line_number":481,"context_line":"\t\tif err :\u003d e.cl.DeleteDevice(aid.ID); err !\u003d nil {"},{"line_number":482,"context_line":"\t\t\treturn true, fmt.Errorf(\"while deleting device (PID: %s): %v\", aid.ID, err)"},{"line_number":483,"context_line":"\t\t}"},{"line_number":484,"context_line":"\t\treturn true, nil"}],"source_content_type":"text/x-go","patch_set":3,"id":"22c7dae2_9c3399d8","line":481,"range":{"start_line":481,"start_character":2,"end_line":481,"end_character":51},"updated":"2022-12-06 12:48:31.000000000","message":"I think this decision shouldn\u0027t be the responsibility of the Shepherd, and definitely not done this haphazardly in \u0027start agent\u0027 logic. Instead, this should be coordinated/expressed within the BMDB.\n\nJust leave broken machines around for now, unless you know this is a huge problem in practice.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":478,"context_line":"\tif ast.inRetries \u003e e.o.AgentInitRetries {"},{"line_number":479,"context_line":"\t\tklog.Warningf(\"Could not start the agent - deprovisioning... (provider ID: %s)\", aid.ID)"},{"line_number":480,"context_line":"\t\t// TODO(mateusz@monogon.tech): delete the device in BMDB."},{"line_number":481,"context_line":"\t\tif err :\u003d e.cl.DeleteDevice(aid.ID); err !\u003d nil {"},{"line_number":482,"context_line":"\t\t\treturn true, fmt.Errorf(\"while deleting device (PID: %s): %v\", aid.ID, err)"},{"line_number":483,"context_line":"\t\t}"},{"line_number":484,"context_line":"\t\treturn true, nil"}],"source_content_type":"text/x-go","patch_set":3,"id":"170259ba_1152bcb3","line":481,"range":{"start_line":481,"start_character":2,"end_line":481,"end_character":51},"in_reply_to":"22c7dae2_9c3399d8","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"\t// Query BMDB for the device\u0027s canonical ID (as opposed to the provider ID)."},{"line_number":488,"context_line":"\tklog.Infof(\"Querying device\u0027s canonical ID (PID: %s).\", aid.ID)"},{"line_number":489,"context_line":"\tmpid, err :\u003d canonicalDeviceID(ctx, sess, aid.ID)"},{"line_number":490,"context_line":"\tif err !\u003d nil {"},{"line_number":491,"context_line":"\t\treturn false, fmt.Errorf(\"while querying device\u0027s canonical ID: %v\", err)"},{"line_number":492,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"c016beaf_ac383fea","line":489,"range":{"start_line":489,"start_character":14,"end_line":489,"end_character":31},"updated":"2022-12-06 12:48:31.000000000","message":"Can\u0027t you pass that over initCandidateC so you don\u0027t have to retrieve it here again? This should be in model.MachineProvided, no?","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":486,"context_line":""},{"line_number":487,"context_line":"\t// Query BMDB for the device\u0027s canonical ID (as opposed to the provider ID)."},{"line_number":488,"context_line":"\tklog.Infof(\"Querying device\u0027s canonical ID (PID: %s).\", aid.ID)"},{"line_number":489,"context_line":"\tmpid, err :\u003d canonicalDeviceID(ctx, sess, aid.ID)"},{"line_number":490,"context_line":"\tif err !\u003d nil {"},{"line_number":491,"context_line":"\t\treturn false, fmt.Errorf(\"while querying device\u0027s canonical ID: %v\", err)"},{"line_number":492,"context_line":"\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"2c4466b5_112a642a","line":489,"range":{"start_line":489,"start_character":14,"end_line":489,"end_character":31},"in_reply_to":"c016beaf_ac383fea","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":541,"context_line":"\t\tif err !\u003d nil {"},{"line_number":542,"context_line":"\t\t\treturn fmt.Errorf(\"while listing devices: %v\", err)"},{"line_number":543,"context_line":"\t\t}"},{"line_number":544,"context_line":"\t\tif e.o.DeviceCountLimit !\u003d 0 \u0026\u0026 len(dm) \u003e\u003d e.o.DeviceCountLimit {"},{"line_number":545,"context_line":"\t\t\tklog.Infof(\"Managed device count limit of %d/%d reached.\", len(dm), e.o.DeviceCountLimit)"},{"line_number":546,"context_line":"\t\t\treturn nil"},{"line_number":547,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"15c0dc64_dce12dc3","line":544,"range":{"start_line":544,"start_character":5,"end_line":544,"end_character":25},"updated":"2022-12-06 12:48:31.000000000","message":"You\u0027ve already checked this.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":541,"context_line":"\t\tif err !\u003d nil {"},{"line_number":542,"context_line":"\t\t\treturn fmt.Errorf(\"while listing devices: %v\", err)"},{"line_number":543,"context_line":"\t\t}"},{"line_number":544,"context_line":"\t\tif e.o.DeviceCountLimit !\u003d 0 \u0026\u0026 len(dm) \u003e\u003d e.o.DeviceCountLimit {"},{"line_number":545,"context_line":"\t\t\tklog.Infof(\"Managed device count limit of %d/%d reached.\", len(dm), e.o.DeviceCountLimit)"},{"line_number":546,"context_line":"\t\t\treturn nil"},{"line_number":547,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"fafb76f7_cfd6bd4d","line":544,"range":{"start_line":544,"start_character":5,"end_line":544,"end_character":25},"in_reply_to":"15c0dc64_dce12dc3","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":730,"context_line":"\t\treturn true, nil"},{"line_number":731,"context_line":"\t}"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"\t// Attempt to recover the device by rebooting it."},{"line_number":734,"context_line":"\tklog.Infof(\"Attempting to recover the device (provider ID: %s, tried %d/%d times)\", rc.ProviderID, ast.rcRetries, e.o.AgentRecoveryRetries)"},{"line_number":735,"context_line":"\tif err :\u003d e.cl.RebootDevice(rc.ProviderID); err !\u003d nil {"},{"line_number":736,"context_line":"\t\treturn true, fmt.Errorf(\"while rebooting recovery candidate (ID: %s, PID: %s): %v.\", rc.MachineID, rc.ProviderID, err)"}],"source_content_type":"text/x-go","patch_set":3,"id":"f3d74df8_cfb9f9d2","line":733,"range":{"start_line":733,"start_character":1,"end_line":733,"end_character":50},"updated":"2022-12-06 12:48:31.000000000","message":"I guess we should define somewhere what \u0027recovery\u0027 actually means... my thought so far was that it\u0027s attempting to restart the agent somehow, while preserving existing data if possible (probably not).","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":730,"context_line":"\t\treturn true, nil"},{"line_number":731,"context_line":"\t}"},{"line_number":732,"context_line":""},{"line_number":733,"context_line":"\t// Attempt to recover the device by rebooting it."},{"line_number":734,"context_line":"\tklog.Infof(\"Attempting to recover the device (provider ID: %s, tried %d/%d times)\", rc.ProviderID, ast.rcRetries, e.o.AgentRecoveryRetries)"},{"line_number":735,"context_line":"\tif err :\u003d e.cl.RebootDevice(rc.ProviderID); err !\u003d nil {"},{"line_number":736,"context_line":"\t\treturn true, fmt.Errorf(\"while rebooting recovery candidate (ID: %s, PID: %s): %v.\", rc.MachineID, rc.ProviderID, err)"}],"source_content_type":"text/x-go","patch_set":3,"id":"ca5d4285_a38a41ef","line":733,"range":{"start_line":733,"start_character":1,"end_line":733,"end_character":50},"in_reply_to":"f3d74df8_cfb9f9d2","updated":"2023-01-12 19:42:49.000000000","message":"I\u0027ve added a TODO note here.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":733,"context_line":"\t// Attempt to recover the device by rebooting it."},{"line_number":734,"context_line":"\tklog.Infof(\"Attempting to recover the device (provider ID: %s, tried %d/%d times)\", rc.ProviderID, ast.rcRetries, e.o.AgentRecoveryRetries)"},{"line_number":735,"context_line":"\tif err :\u003d e.cl.RebootDevice(rc.ProviderID); err !\u003d nil {"},{"line_number":736,"context_line":"\t\treturn true, fmt.Errorf(\"while rebooting recovery candidate (ID: %s, PID: %s): %v.\", rc.MachineID, rc.ProviderID, err)"},{"line_number":737,"context_line":"\t}"},{"line_number":738,"context_line":"\tast.rcRetries++"},{"line_number":739,"context_line":"\tast.rcRetryAfter \u003d time.Now().Add(e.o.AgentRecoveryRetryTimeout)"}],"source_content_type":"text/x-go","patch_set":3,"id":"0a269cf2_88a12486","line":736,"range":{"start_line":736,"start_character":81,"end_line":736,"end_character":83},"updated":"2022-12-06 12:48:31.000000000","message":"%w, also check all other fmt.Errorf calls.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":733,"context_line":"\t// Attempt to recover the device by rebooting it."},{"line_number":734,"context_line":"\tklog.Infof(\"Attempting to recover the device (provider ID: %s, tried %d/%d times)\", rc.ProviderID, ast.rcRetries, e.o.AgentRecoveryRetries)"},{"line_number":735,"context_line":"\tif err :\u003d e.cl.RebootDevice(rc.ProviderID); err !\u003d nil {"},{"line_number":736,"context_line":"\t\treturn true, fmt.Errorf(\"while rebooting recovery candidate (ID: %s, PID: %s): %v.\", rc.MachineID, rc.ProviderID, err)"},{"line_number":737,"context_line":"\t}"},{"line_number":738,"context_line":"\tast.rcRetries++"},{"line_number":739,"context_line":"\tast.rcRetryAfter \u003d time.Now().Add(e.o.AgentRecoveryRetryTimeout)"}],"source_content_type":"text/x-go","patch_set":3,"id":"9171032c_77b0d9e4","line":736,"range":{"start_line":736,"start_character":81,"end_line":736,"end_character":83},"in_reply_to":"0a269cf2_88a12486","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":790,"context_line":"\t\t\t\tklog.Errorf(\"While sourcing provisioning candidates: %v\", err)"},{"line_number":791,"context_line":"\t\t\t\treturn err"},{"line_number":792,"context_line":"\t\t\t}"},{"line_number":793,"context_line":"\t\t\tif err :\u003d gctx.Err(); err !\u003d nil {"},{"line_number":794,"context_line":"\t\t\t\treturn err"},{"line_number":795,"context_line":"\t\t\t}"},{"line_number":796,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"a90d6b0f_d7725464","line":793,"range":{"start_line":793,"start_character":3,"end_line":793,"end_character":37},"updated":"2022-12-06 12:48:31.000000000","message":"If the context has an associated error, the previous or next call to provideDevices should return that error. There shouldn\u0027t be a need to explicitly check this here.","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":790,"context_line":"\t\t\t\tklog.Errorf(\"While sourcing provisioning candidates: %v\", err)"},{"line_number":791,"context_line":"\t\t\t\treturn err"},{"line_number":792,"context_line":"\t\t\t}"},{"line_number":793,"context_line":"\t\t\tif err :\u003d gctx.Err(); err !\u003d nil {"},{"line_number":794,"context_line":"\t\t\t\treturn err"},{"line_number":795,"context_line":"\t\t\t}"},{"line_number":796,"context_line":"\t\t}"}],"source_content_type":"text/x-go","patch_set":3,"id":"1485431e_85e24f3b","line":793,"range":{"start_line":793,"start_character":3,"end_line":793,"end_character":37},"in_reply_to":"a90d6b0f_d7725464","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"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":"12973b903d580999e2ec80062b08cc78bba4c1d2","unresolved":true,"context_lines":[{"line_number":914,"context_line":"\t\treturn err"},{"line_number":915,"context_line":"\t}"},{"line_number":916,"context_line":"\tif len(seed) !\u003d ed25519.SeedSize {"},{"line_number":917,"context_line":"\t\treturn fmt.Errorf(\"unexpected seed length.\")"},{"line_number":918,"context_line":"\t}"},{"line_number":919,"context_line":"\tpriv :\u003d ed25519.NewKeyFromSeed(seed)"},{"line_number":920,"context_line":"\tpub :\u003d priv.Public()"}],"source_content_type":"text/x-go","patch_set":3,"id":"9e8d1abc_b1401273","line":917,"range":{"start_line":917,"start_character":43,"end_line":917,"end_character":44},"updated":"2022-12-06 12:48:31.000000000","message":"style: no period in errors.\n\nalso, `unexpected seed length in file`","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"},{"author":{"_account_id":1000010,"name":"Mateusz Zalega","display_name":"msgctl","email":"mateusz@monogon.tech","username":"mateusz","avatars":[{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/30cae8ca0782f23ce0a60ac80fda3dd9.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"f8d98a966fce5049e22c6bddb9fcac44b8d9e7e9","unresolved":false,"context_lines":[{"line_number":914,"context_line":"\t\treturn err"},{"line_number":915,"context_line":"\t}"},{"line_number":916,"context_line":"\tif len(seed) !\u003d ed25519.SeedSize {"},{"line_number":917,"context_line":"\t\treturn fmt.Errorf(\"unexpected seed length.\")"},{"line_number":918,"context_line":"\t}"},{"line_number":919,"context_line":"\tpriv :\u003d ed25519.NewKeyFromSeed(seed)"},{"line_number":920,"context_line":"\tpub :\u003d priv.Public()"}],"source_content_type":"text/x-go","patch_set":3,"id":"de4d8eef_f008a7a5","line":917,"range":{"start_line":917,"start_character":43,"end_line":917,"end_character":44},"in_reply_to":"9e8d1abc_b1401273","updated":"2023-01-12 19:42:49.000000000","message":"Done","commit_id":"9c5a96b67e1ce9f06cb6214f30d9a910c04fc60c"}]}
