From 425b974331b152ba30cba3173de2b93466ddfae1 Mon Sep 17 00:00:00 2001 From: Pasha Sviderski Date: Tue, 16 Dec 2025 11:28:11 +1000 Subject: [PATCH] fix: panic when initialising new cluster with --connect --- cmd/uncloud/machine/init.go | 7 ++++++- cmd/uncloud/main.go | 2 +- internal/cli/cli.go | 26 +++++++++++++++++++++----- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/cmd/uncloud/machine/init.go b/cmd/uncloud/machine/init.go index 1de3c6c3..99a63a9b 100644 --- a/cmd/uncloud/machine/init.go +++ b/cmd/uncloud/machine/init.go @@ -33,7 +33,7 @@ type initOptions struct { func NewInitCommand() *cobra.Command { opts := initOptions{} cmd := &cobra.Command{ - Use: "init [USER@HOST:PORT]", + Use: "init [schema://]USER@HOST[:PORT]", Short: "Initialise a new cluster with a remote machine as the first member.", Long: `Initialise a new cluster by setting up a remote machine as the first member. This command creates a new context in your Uncloud config to manage the cluster. @@ -128,6 +128,11 @@ Connection methods: } func initCluster(ctx context.Context, uncli *cli.CLI, remoteMachine *cli.RemoteMachine, opts initOptions) error { + if uncli.Config == nil { + // Config is nil when connecting directly to a remote machine (--connect) without using Uncloud config. + return fmt.Errorf("do not specify --connect when initialising a new cluster") + } + netPrefix, err := netip.ParsePrefix(opts.network) if err != nil { return fmt.Errorf("parse network CIDR: %w", err) diff --git a/cmd/uncloud/main.go b/cmd/uncloud/main.go index d3d84b3e..09d7df78 100644 --- a/cmd/uncloud/main.go +++ b/cmd/uncloud/main.go @@ -40,8 +40,8 @@ func main() { SilenceErrors: true, PersistentPreRunE: func(cmd *cobra.Command, args []string) error { cli.BindEnvToFlag(cmd, "connect", "UNCLOUD_CONNECT") - cli.BindEnvToFlag(cmd, "uncloud-config", "UNCLOUD_CONFIG") cli.BindEnvToFlag(cmd, "context", "UNCLOUD_CONTEXT") + cli.BindEnvToFlag(cmd, "uncloud-config", "UNCLOUD_CONFIG") var conn *config.MachineConnection if opts.connect != "" { diff --git a/internal/cli/cli.go b/internal/cli/cli.go index 446197ae..e34a393b 100644 --- a/internal/cli/cli.go +++ b/internal/cli/cli.go @@ -171,7 +171,7 @@ func (cli *CLI) InitCluster(ctx context.Context, opts InitClusterOptions) (*clie return cli.initRemoteMachine(ctx, opts) } // TODO: implement local machine initialisation - return nil, fmt.Errorf("local machine initialisation is not implemented yet") + return nil, fmt.Errorf("local machine initialisation is not implemented yet. Please specify a remote machine") } func (cli *CLI) initRemoteMachine(ctx context.Context, opts InitClusterOptions) (*client.Client, error) { @@ -246,9 +246,17 @@ func (cli *CLI) initRemoteMachine(ctx context.Context, opts InitClusterOptions) MachineID: resp.Machine.Id, } if opts.RemoteMachine.UseSSHCLI { - connCfg.SSHCLI = config.NewSSHDestination(opts.RemoteMachine.User, opts.RemoteMachine.Host, opts.RemoteMachine.Port) + connCfg.SSHCLI = config.NewSSHDestination( + opts.RemoteMachine.User, + opts.RemoteMachine.Host, + opts.RemoteMachine.Port, + ) } else { - connCfg.SSH = config.NewSSHDestination(opts.RemoteMachine.User, opts.RemoteMachine.Host, opts.RemoteMachine.Port) + connCfg.SSH = config.NewSSHDestination( + opts.RemoteMachine.User, + opts.RemoteMachine.Host, + opts.RemoteMachine.Port, + ) } cli.Config.Contexts[contextName].Connections = append(cli.Config.Contexts[contextName].Connections, connCfg) if err = cli.Config.Save(); err != nil { @@ -415,9 +423,17 @@ func (cli *CLI) AddMachine(ctx context.Context, opts AddMachineOptions) (*client MachineID: addResp.Machine.Id, } if opts.RemoteMachine.UseSSHCLI { - connCfg.SSHCLI = config.NewSSHDestination(opts.RemoteMachine.User, opts.RemoteMachine.Host, opts.RemoteMachine.Port) + connCfg.SSHCLI = config.NewSSHDestination( + opts.RemoteMachine.User, + opts.RemoteMachine.Host, + opts.RemoteMachine.Port, + ) } else { - connCfg.SSH = config.NewSSHDestination(opts.RemoteMachine.User, opts.RemoteMachine.Host, opts.RemoteMachine.Port) + connCfg.SSH = config.NewSSHDestination( + opts.RemoteMachine.User, + opts.RemoteMachine.Host, + opts.RemoteMachine.Port, + ) } cli.Config.Contexts[contextName].Connections = append(cli.Config.Contexts[contextName].Connections, connCfg) if err = cli.Config.Save(); err != nil {