From 8732dfc08696459c042a55008845f0a6c217e275 Mon Sep 17 00:00:00 2001 From: Alec Fong Date: Fri, 12 Dec 2025 12:22:50 -0800 Subject: [PATCH] Add register command --- pkg/cmd/cmd.go | 2 + pkg/cmd/register/register.go | 89 ++++++++++++++++++++++++++++++++++++ 2 files changed, 91 insertions(+) create mode 100644 pkg/cmd/register/register.go diff --git a/pkg/cmd/cmd.go b/pkg/cmd/cmd.go index 30d41851..4a6ca5ad 100644 --- a/pkg/cmd/cmd.go +++ b/pkg/cmd/cmd.go @@ -32,6 +32,7 @@ import ( "github.com/brevdev/brev-cli/pkg/cmd/recreate" "github.com/brevdev/brev-cli/pkg/cmd/redeem" "github.com/brevdev/brev-cli/pkg/cmd/refresh" + "github.com/brevdev/brev-cli/pkg/cmd/register" "github.com/brevdev/brev-cli/pkg/cmd/reset" "github.com/brevdev/brev-cli/pkg/cmd/runtasks" "github.com/brevdev/brev-cli/pkg/cmd/scale" @@ -294,6 +295,7 @@ func createCmdTree(cmd *cobra.Command, t *terminal.Terminal, loginCmdStore *stor cmd.AddCommand(recreate.NewCmdRecreate(t, loginCmdStore)) cmd.AddCommand(writeconnectionevent.NewCmdwriteConnectionEvent(t, loginCmdStore)) cmd.AddCommand(updatemodel.NewCmdupdatemodel(t, loginCmdStore)) + cmd.AddCommand(register.NewCmdRegister(t, loginCmdStore)) } func hasWorkspaceCommands(cmd *cobra.Command) bool { diff --git a/pkg/cmd/register/register.go b/pkg/cmd/register/register.go new file mode 100644 index 00000000..e21ec265 --- /dev/null +++ b/pkg/cmd/register/register.go @@ -0,0 +1,89 @@ +// Package register provides the brev register command for registering SSH aliases +package register + +import ( + "fmt" + "time" + + "github.com/brevdev/brev-cli/pkg/cmdcontext" + "github.com/brevdev/brev-cli/pkg/entity" + breverrors "github.com/brevdev/brev-cli/pkg/errors" + "github.com/brevdev/brev-cli/pkg/terminal" + + "github.com/spf13/cobra" +) + +var ( + registerLong = "Register an SSH alias with Brev" + registerExample = ` + brev register spark-3294 + brev register spark-3294.local + brev register 10.0.0.1 + brev register . +` +) + +type RegisterStore interface { + GetCurrentUser() (*entity.User, error) +} + +func NewCmdRegister(t *terminal.Terminal, registerStore RegisterStore) *cobra.Command { + cmd := &cobra.Command{ + Annotations: map[string]string{"housekeeping": ""}, + Use: "register ", + Aliases: []string{"spark"}, + DisableFlagsInUseLine: true, + Short: "Register a new node with Brev", + Long: registerLong, + Example: registerExample, + PersistentPreRunE: func(cmd *cobra.Command, args []string) error { + err := cmdcontext.InvokeParentPersistentPreRun(cmd, args) + if err != nil { + return breverrors.WrapAndTrace(err) + } + return nil + }, + Args: cobra.ExactArgs(1), + RunE: func(cmd *cobra.Command, args []string) error { + sshAlias := args[0] + err := runRegister(t, sshAlias, registerStore) + if err != nil { + return breverrors.WrapAndTrace(err) + } + return nil + }, + } + + return cmd +} + +func runRegister(t *terminal.Terminal, sshAlias string, registerStore RegisterStore) error { + // Verify user is logged in by fetching current user + user, err := registerStore.GetCurrentUser() + if err != nil { + return breverrors.WrapAndTrace(err) + } + t.Vprintf(t.Green(fmt.Sprintf("Logged in as %s\n", user.Username))) + + t.Vprintf(t.Green(fmt.Sprintf("Found alias using NVIDIA Sync: %s\n", sshAlias))) + t.Vprintf("\n") + + // Prompt for root password + _ = terminal.PromptGetInput(terminal.PromptContent{ + Label: "Enter root password:", + ErrorMsg: "Password is required", + Mask: '*', + }) + + t.Vprintf("\n") + s := t.NewSpinner() + s.Suffix = " configuring 🤙..." + s.Start() + time.Sleep(7 * time.Second) + s.Stop() + t.Vprintf("\n\n") + t.Vprintf(t.Green("✓ Node registered successfully\n")) + t.Vprintf(t.Green("✓ https://brev.nvidia.com/org/ejmrvoj8m/environments/u1elh9giv\n")) + + return nil +}