)]}'
{"metropolis/cli/flags/flags.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":1,"context_line":"// Package flags contains shared flag definitions for Metropolis."},{"line_number":2,"context_line":"package flags"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"errors\""}],"source_content_type":"text/x-go","patch_set":4,"id":"4d82dda3_31bf5aaa","line":2,"range":{"start_line":2,"start_character":8,"end_line":2,"end_character":13},"updated":"2024-08-05 11:54:14.000000000","message":"nit: Perhaps call this `flagdefs`? `flags` is somewhat reserved in the Go ecosystem for either the stdlib `flags` package or packages which implement a superset of the API (eg. `pflags` is sometimes imported as `flags`). And there\u0027s the collision with `flags` which you\u0027ve already had to deal with :).","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5f1dc0278d76870d1bb1c81188f51231634786e6","unresolved":false,"context_lines":[{"line_number":1,"context_line":"// Package flags contains shared flag definitions for Metropolis."},{"line_number":2,"context_line":"package flags"},{"line_number":3,"context_line":""},{"line_number":4,"context_line":"import ("},{"line_number":5,"context_line":"\t\"errors\""}],"source_content_type":"text/x-go","patch_set":4,"id":"8b86b96a_f8a6a7a6","line":2,"range":{"start_line":2,"start_character":8,"end_line":2,"end_character":13},"in_reply_to":"4d82dda3_31bf5aaa","updated":"2024-08-05 15:29:44.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":11,"context_line":"\tcpb \"source.monogon.dev/metropolis/proto/common\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"type tpmModeValue cpb.ClusterConfiguration_TPMMode"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"func (v *tpmModeValue) Set(val string) error {"},{"line_number":17,"context_line":"\tvar tpmMode cpb.ClusterConfiguration_TPMMode"}],"source_content_type":"text/x-go","patch_set":4,"id":"3b2dbb58_5954abb2","line":14,"range":{"start_line":14,"start_character":5,"end_line":14,"end_character":17},"updated":"2024-08-05 11:54:14.000000000","message":"Please mention what interfaces this implements (it\u0027s not obvious to me where `Type` is being used).","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5f1dc0278d76870d1bb1c81188f51231634786e6","unresolved":false,"context_lines":[{"line_number":11,"context_line":"\tcpb \"source.monogon.dev/metropolis/proto/common\""},{"line_number":12,"context_line":")"},{"line_number":13,"context_line":""},{"line_number":14,"context_line":"type tpmModeValue cpb.ClusterConfiguration_TPMMode"},{"line_number":15,"context_line":""},{"line_number":16,"context_line":"func (v *tpmModeValue) Set(val string) error {"},{"line_number":17,"context_line":"\tvar tpmMode cpb.ClusterConfiguration_TPMMode"}],"source_content_type":"text/x-go","patch_set":4,"id":"641c6927_e9435429","line":14,"range":{"start_line":14,"start_character":5,"end_line":14,"end_character":17},"in_reply_to":"3b2dbb58_5954abb2","updated":"2024-08-05 15:29:44.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":99,"context_line":"\treturn \"storageSecurityPolicy\""},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"func StorageSecurityPolicy(flags *flag.FlagSet, name string, value cpb.ClusterConfiguration_StorageSecurityPolicy, usage string) *cpb.ClusterConfiguration_StorageSecurityPolicy {"},{"line_number":103,"context_line":"\tval :\u003d new(cpb.ClusterConfiguration_StorageSecurityPolicy)"},{"line_number":104,"context_line":"\t*val \u003d value"},{"line_number":105,"context_line":"\tflags.Var((*storageSecurityPolicyValue)(val), name, usage+\" (one of: permissive, needs-encryption, needs-encryption-and-authentication, needs-insecure)\")"}],"source_content_type":"text/x-go","patch_set":4,"id":"de3daf4f_c1a9d734","line":102,"range":{"start_line":102,"start_character":5,"end_line":102,"end_character":26},"updated":"2024-08-05 11:54:14.000000000","message":"How about instead of using the wrappers we export the Type aliases and let the consumers with asserting them to/from the underlying proto message type? I feel like most of the time you won\u0027t even need type assertions for that in the callsites, but I\u0027d have to check...","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"253dbc2c5bf2cae19410638700e126cf3d121156","unresolved":true,"context_lines":[{"line_number":99,"context_line":"\treturn \"storageSecurityPolicy\""},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"func StorageSecurityPolicy(flags *flag.FlagSet, name string, value cpb.ClusterConfiguration_StorageSecurityPolicy, usage string) *cpb.ClusterConfiguration_StorageSecurityPolicy {"},{"line_number":103,"context_line":"\tval :\u003d new(cpb.ClusterConfiguration_StorageSecurityPolicy)"},{"line_number":104,"context_line":"\t*val \u003d value"},{"line_number":105,"context_line":"\tflags.Var((*storageSecurityPolicyValue)(val), name, usage+\" (one of: permissive, needs-encryption, needs-encryption-and-authentication, needs-insecure)\")"}],"source_content_type":"text/x-go","patch_set":4,"id":"a4eedacc_dc344a9f","line":102,"range":{"start_line":102,"start_character":5,"end_line":102,"end_character":26},"in_reply_to":"77f722cf_d4b88ffc","updated":"2024-08-06 14:17:08.000000000","message":"Okay, if this is based on how stdlib does it, then let\u0027s keep it that way. Can we maybe also get `.*Var` versions for these functions (ie. `StorageSecurityPolicyVar`, like `flag.String` vs `flag.StringVar`)? Generally we use the `.*Var` form of flags much more commonly than the non-Var versions.","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"640cab9df7246954bf5160183757164180cc0546","unresolved":false,"context_lines":[{"line_number":99,"context_line":"\treturn \"storageSecurityPolicy\""},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"func StorageSecurityPolicy(flags *flag.FlagSet, name string, value cpb.ClusterConfiguration_StorageSecurityPolicy, usage string) *cpb.ClusterConfiguration_StorageSecurityPolicy {"},{"line_number":103,"context_line":"\tval :\u003d new(cpb.ClusterConfiguration_StorageSecurityPolicy)"},{"line_number":104,"context_line":"\t*val \u003d value"},{"line_number":105,"context_line":"\tflags.Var((*storageSecurityPolicyValue)(val), name, usage+\" (one of: permissive, needs-encryption, needs-encryption-and-authentication, needs-insecure)\")"}],"source_content_type":"text/x-go","patch_set":4,"id":"00d7870d_3c08eeb5","line":102,"range":{"start_line":102,"start_character":5,"end_line":102,"end_character":26},"in_reply_to":"a4eedacc_dc344a9f","updated":"2024-08-07 09:06:24.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5f1dc0278d76870d1bb1c81188f51231634786e6","unresolved":true,"context_lines":[{"line_number":99,"context_line":"\treturn \"storageSecurityPolicy\""},{"line_number":100,"context_line":"}"},{"line_number":101,"context_line":""},{"line_number":102,"context_line":"func StorageSecurityPolicy(flags *flag.FlagSet, name string, value cpb.ClusterConfiguration_StorageSecurityPolicy, usage string) *cpb.ClusterConfiguration_StorageSecurityPolicy {"},{"line_number":103,"context_line":"\tval :\u003d new(cpb.ClusterConfiguration_StorageSecurityPolicy)"},{"line_number":104,"context_line":"\t*val \u003d value"},{"line_number":105,"context_line":"\tflags.Var((*storageSecurityPolicyValue)(val), name, usage+\" (one of: permissive, needs-encryption, needs-encryption-and-authentication, needs-insecure)\")"}],"source_content_type":"text/x-go","patch_set":4,"id":"77f722cf_d4b88ffc","line":102,"range":{"start_line":102,"start_character":5,"end_line":102,"end_character":26},"in_reply_to":"de3daf4f_c1a9d734","updated":"2024-08-05 15:29:44.000000000","message":"My idea was to provide the same interface as e.g. `flag.FlagSet.Int` for these special types. `flag.FlagSet.Int` is implemented using the `flag.intValue` type alias, which is also not exported. So the advantage of exporting these functions is that consumers use them in the same way as flags for standard types.","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"}],"metropolis/test/launch/cli/launch-cluster/main.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"var ("},{"line_number":36,"context_line":"\tnumNodes                     \u003d flag.Int(\"num-nodes\", 3, \"Number of cluster nodes\")"},{"line_number":37,"context_line":"\tclusterTPMMode               \u003d metroflags.TPMMode(flag.CommandLine, \"tpm-mode\", cpb.ClusterConfiguration_TPM_MODE_REQUIRED, \"TPM mode to set on cluster\")"},{"line_number":38,"context_line":"\tclusterStorageSecurityPolicy \u003d metroflags.StorageSecurityPolicy(flag.CommandLine, \"storage-security\", cpb.ClusterConfiguration_STORAGE_SECURITY_POLICY_NEEDS_INSECURE, \"Storage security policy to set on cluster\")"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-go","patch_set":4,"id":"13cfdd06_421ccdc9","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":50},"updated":"2024-08-05 11:54:14.000000000","message":"Can we use `flag.Var` here instead? Binding to flag.CommandLine like this feels somewhat hacky, no? Or is this also done elsewhere?","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5f1dc0278d76870d1bb1c81188f51231634786e6","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"var ("},{"line_number":36,"context_line":"\tnumNodes                     \u003d flag.Int(\"num-nodes\", 3, \"Number of cluster nodes\")"},{"line_number":37,"context_line":"\tclusterTPMMode               \u003d metroflags.TPMMode(flag.CommandLine, \"tpm-mode\", cpb.ClusterConfiguration_TPM_MODE_REQUIRED, \"TPM mode to set on cluster\")"},{"line_number":38,"context_line":"\tclusterStorageSecurityPolicy \u003d metroflags.StorageSecurityPolicy(flag.CommandLine, \"storage-security\", cpb.ClusterConfiguration_STORAGE_SECURITY_POLICY_NEEDS_INSECURE, \"Storage security policy to set on cluster\")"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-go","patch_set":4,"id":"c427f0b7_c4b1d4fd","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":50},"in_reply_to":"13cfdd06_421ccdc9","updated":"2024-08-05 15:29:44.000000000","message":"`flag.Int()` is just a wrapper for `flag.CommandLine.Int()`. I don\u0027t find it that ugly to have to specify the `flag.CommandLine` parameter, so I did not create such a wrapper for `TPMMode()`. It would also cause a naming conflict, as I can\u0027t add methods to `flag.FlagSet`.\n\nBut if you still think it\u0027s better to export `tpmModeValue` and call `flag.Var` at consumers, I can change it.","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"640cab9df7246954bf5160183757164180cc0546","unresolved":false,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"var ("},{"line_number":36,"context_line":"\tnumNodes                     \u003d flag.Int(\"num-nodes\", 3, \"Number of cluster nodes\")"},{"line_number":37,"context_line":"\tclusterTPMMode               \u003d metroflags.TPMMode(flag.CommandLine, \"tpm-mode\", cpb.ClusterConfiguration_TPM_MODE_REQUIRED, \"TPM mode to set on cluster\")"},{"line_number":38,"context_line":"\tclusterStorageSecurityPolicy \u003d metroflags.StorageSecurityPolicy(flag.CommandLine, \"storage-security\", cpb.ClusterConfiguration_STORAGE_SECURITY_POLICY_NEEDS_INSECURE, \"Storage security policy to set on cluster\")"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-go","patch_set":4,"id":"5187a8cc_905cf736","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":50},"in_reply_to":"992b5556_2d4330f4","updated":"2024-08-07 09:06:24.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"253dbc2c5bf2cae19410638700e126cf3d121156","unresolved":true,"context_lines":[{"line_number":34,"context_line":""},{"line_number":35,"context_line":"var ("},{"line_number":36,"context_line":"\tnumNodes                     \u003d flag.Int(\"num-nodes\", 3, \"Number of cluster nodes\")"},{"line_number":37,"context_line":"\tclusterTPMMode               \u003d metroflags.TPMMode(flag.CommandLine, \"tpm-mode\", cpb.ClusterConfiguration_TPM_MODE_REQUIRED, \"TPM mode to set on cluster\")"},{"line_number":38,"context_line":"\tclusterStorageSecurityPolicy \u003d metroflags.StorageSecurityPolicy(flag.CommandLine, \"storage-security\", cpb.ClusterConfiguration_STORAGE_SECURITY_POLICY_NEEDS_INSECURE, \"Storage security policy to set on cluster\")"},{"line_number":39,"context_line":")"},{"line_number":40,"context_line":""}],"source_content_type":"text/x-go","patch_set":4,"id":"992b5556_2d4330f4","line":37,"range":{"start_line":37,"start_character":32,"end_line":37,"end_character":50},"in_reply_to":"c427f0b7_c4b1d4fd","updated":"2024-08-06 14:17:08.000000000","message":"Yeah I guess I\u0027m just saddened that there\u0027s no way to extend the flag.FlagSet type to declare out own members on it. I should stop mourning that this isn\u0027t Rust.\n\nLet\u0027s just keep it that way - or maybe at least convert these to use the `.*Var` form of FlagSet methods / flagdefs functions called before flag.Parse so that we keep consistent with the rest of the codebase.","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":50,"context_line":"func main() {"},{"line_number":51,"context_line":"\tdefaultNodeOptions :\u003d nodeOptions{}"},{"line_number":52,"context_line":"\tselectedNodes :\u003d []*nodeOptions{\u0026defaultNodeOptions}"},{"line_number":53,"context_line":"\tvar nodesOptions []nodeOptions"},{"line_number":54,"context_line":"\tflag.Func(\"node\", \"Select the node or nodes to which following node flags apply. This is a comma-separated list of node indices or ranges. Example: -node\u003d0,3-5. Initially, node flags apply to all nodes.\", func(nodeSelector string) error {"},{"line_number":55,"context_line":"\t\tselectedNodes \u003d []*nodeOptions{}"},{"line_number":56,"context_line":"\t\tfor _, part :\u003d range strings.Split(nodeSelector, \",\") {"}],"source_content_type":"text/x-go","patch_set":4,"id":"82ab7dfd_7d979c41","line":53,"range":{"start_line":53,"start_character":1,"end_line":53,"end_character":30},"updated":"2024-08-05 11:54:14.000000000","message":"Being able to specify -node\u003d... multiple times between -smp\u003dx and -mem\u003dx is a cool idea, but it\u0027s fairly uncommon and isn\u0027t very obvious (I don\u0027t think I\u0027ve encountered this kind of semantics in any other tool, maybe other than `iptables` and `find`?).\n\nI\u0027d suggest dumbing this down to a `Selector` type which implements the range/comma semantics, using that as the type for the `kubernetes-worker`, `kubernetes-controller` and `consensus-member` flags, and making `smp` and `mem` apply to all nodes. It\u0027s less features, but also less surprising, which I think is fine here? In the future we could then expand the Selector type to be a ValueSelector instead, which could do `-mem\u003d2G;0,3-5` or something like that.","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"640cab9df7246954bf5160183757164180cc0546","unresolved":false,"context_lines":[{"line_number":50,"context_line":"func main() {"},{"line_number":51,"context_line":"\tdefaultNodeOptions :\u003d nodeOptions{}"},{"line_number":52,"context_line":"\tselectedNodes :\u003d []*nodeOptions{\u0026defaultNodeOptions}"},{"line_number":53,"context_line":"\tvar nodesOptions []nodeOptions"},{"line_number":54,"context_line":"\tflag.Func(\"node\", \"Select the node or nodes to which following node flags apply. This is a comma-separated list of node indices or ranges. Example: -node\u003d0,3-5. Initially, node flags apply to all nodes.\", func(nodeSelector string) error {"},{"line_number":55,"context_line":"\t\tselectedNodes \u003d []*nodeOptions{}"},{"line_number":56,"context_line":"\t\tfor _, part :\u003d range strings.Split(nodeSelector, \",\") {"}],"source_content_type":"text/x-go","patch_set":4,"id":"cc7ff0ff_252f45cf","line":53,"range":{"start_line":53,"start_character":1,"end_line":53,"end_character":30},"in_reply_to":"82ab7dfd_7d979c41","updated":"2024-08-07 09:06:24.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"}],"metropolis/test/launch/cluster.go":[{"author":{"_account_id":1000002,"name":"Serge Bazanski","display_name":"Serge","email":"serge@monogon.tech","username":"serge","avatars":[{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/52c41428b6369f2c02b9717425216f7d.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"\t// SMP is the number of CPUs of the VM."},{"line_number":67,"context_line":"\t// This is passed to the -smp flag of qemu."},{"line_number":68,"context_line":"\tSMP string"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."}],"source_content_type":"text/x-go","patch_set":4,"id":"60cd5ad3_3ce86ea5","line":68,"range":{"start_line":68,"start_character":5,"end_line":68,"end_character":11},"updated":"2024-08-05 11:54:14.000000000","message":"Perhaps type this stronger? At least SMP could be an uint, with the zero value also making sense (ie. 0 can be used to mean \u0027default\u0027, as no-one would ever want to specify 0 CPU cores)","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"253dbc2c5bf2cae19410638700e126cf3d121156","unresolved":true,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"\t// SMP is the number of CPUs of the VM."},{"line_number":67,"context_line":"\t// This is passed to the -smp flag of qemu."},{"line_number":68,"context_line":"\tSMP string"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."}],"source_content_type":"text/x-go","patch_set":4,"id":"f4efc95d_efb2dd99","line":68,"range":{"start_line":68,"start_character":5,"end_line":68,"end_character":11},"in_reply_to":"1f3ed1fa_c3351c66","updated":"2024-08-06 14:17:08.000000000","message":"As discussed in weekly meeting, we\u0027ll be better off turning this into a `Cores` and `ThreadsPerCore` (default 1) int values instead of exposign qemu internals.","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"5f1dc0278d76870d1bb1c81188f51231634786e6","unresolved":true,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"\t// SMP is the number of CPUs of the VM."},{"line_number":67,"context_line":"\t// This is passed to the -smp flag of qemu."},{"line_number":68,"context_line":"\tSMP string"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."}],"source_content_type":"text/x-go","patch_set":4,"id":"1f3ed1fa_c3351c66","line":68,"range":{"start_line":68,"start_character":5,"end_line":68,"end_character":11},"in_reply_to":"60cd5ad3_3ce86ea5","updated":"2024-08-05 15:29:44.000000000","message":"The idea was that you could also specify the additional CPU topology parameters of QEMU: https://www.qemu.org/docs/master/system/invocation.html#:~:text\u003d%2Dsmp,-%5B%5Bcpus%3D%5Dn%5D%5B%2Cmaxcpus\n\nThe memory flag also supports some additional parameters.\n\nThough I\u0027m not sure if anyone would actually need to set these, so if you think it\u0027s not needed, I can change these to uints.","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"640cab9df7246954bf5160183757164180cc0546","unresolved":false,"context_lines":[{"line_number":65,"context_line":""},{"line_number":66,"context_line":"\t// SMP is the number of CPUs of the VM."},{"line_number":67,"context_line":"\t// This is passed to the -smp flag of qemu."},{"line_number":68,"context_line":"\tSMP string"},{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."}],"source_content_type":"text/x-go","patch_set":4,"id":"45a3cb50_92f822e5","line":68,"range":{"start_line":68,"start_character":5,"end_line":68,"end_character":11},"in_reply_to":"f4efc95d_efb2dd99","updated":"2024-08-07 09:06:24.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."},{"line_number":72,"context_line":"\tMemory string"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"\t// Ports contains the port mapping where to expose the internal ports of the VM to"},{"line_number":75,"context_line":"\t// the host. See IdentityPortMap() and ConflictFreePortMap(). Ignored when"}],"source_content_type":"text/x-go","patch_set":4,"id":"2ffcb11e_64028017","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":14},"updated":"2024-08-05 11:54:14.000000000","message":"Also consider typing more strongly (as above).","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"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":"72df0903c3aa5a70de639b5a0dbc6034c9bc2b5d","unresolved":true,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."},{"line_number":72,"context_line":"\tMemory string"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"\t// Ports contains the port mapping where to expose the internal ports of the VM to"},{"line_number":75,"context_line":"\t// the host. See IdentityPortMap() and ConflictFreePortMap(). Ignored when"}],"source_content_type":"text/x-go","patch_set":4,"id":"f3adfd20_dd5e5049","line":72,"range":{"start_line":72,"start_character":1,"end_line":72,"end_character":7},"updated":"2024-08-05 11:54:14.000000000","message":"MemoryMB","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"640cab9df7246954bf5160183757164180cc0546","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."},{"line_number":72,"context_line":"\tMemory string"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"\t// Ports contains the port mapping where to expose the internal ports of the VM to"},{"line_number":75,"context_line":"\t// the host. See IdentityPortMap() and ConflictFreePortMap(). Ignored when"}],"source_content_type":"text/x-go","patch_set":4,"id":"7745ac36_b251b4dd","line":72,"range":{"start_line":72,"start_character":8,"end_line":72,"end_character":14},"in_reply_to":"2ffcb11e_64028017","updated":"2024-08-07 09:06:24.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"},{"author":{"_account_id":1000038,"name":"Jan Schär","display_name":"Jan","email":"jan@monogon.tech","username":"jan","avatars":[{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d32","height":32},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d56","height":56},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d100","height":100},{"url":"https://www.gravatar.com/avatar/fd0e7f48847aa0e46c8f361df2d6c26b.jpg?d\u003didenticon\u0026r\u003dpg\u0026s\u003d120","height":120}]},"change_message_id":"640cab9df7246954bf5160183757164180cc0546","unresolved":false,"context_lines":[{"line_number":69,"context_line":""},{"line_number":70,"context_line":"\t// Memory is the size of RAM in megabytes of the VM."},{"line_number":71,"context_line":"\t// This is passed to the -m flag of qemu."},{"line_number":72,"context_line":"\tMemory string"},{"line_number":73,"context_line":""},{"line_number":74,"context_line":"\t// Ports contains the port mapping where to expose the internal ports of the VM to"},{"line_number":75,"context_line":"\t// the host. See IdentityPortMap() and ConflictFreePortMap(). Ignored when"}],"source_content_type":"text/x-go","patch_set":4,"id":"73cc24c4_cd3b4f1c","line":72,"range":{"start_line":72,"start_character":1,"end_line":72,"end_character":7},"in_reply_to":"f3adfd20_dd5e5049","updated":"2024-08-07 09:06:24.000000000","message":"Done","commit_id":"c63467a2b4bb43e6ae13141035feaa12662d0a29"}]}
