diff --git a/cli/internal/validate.go b/cli/internal/validate.go index d89f8e327..091fd57ea 100644 --- a/cli/internal/validate.go +++ b/cli/internal/validate.go @@ -41,3 +41,14 @@ func ValidateApp(c *cli.Context) config.App { return app } + +// ValidateDomain ensures the domain name arg is valid. +func ValidateDomain(c *cli.Context) string { + domainName := c.Args().First() + + if domainName == "" { + ShowSubcommandHelpAndError(c, errors.New("no domain provided")) + } + + return domainName +} diff --git a/cli/server/add.go b/cli/server/add.go index ab60fa516..77bca81f8 100644 --- a/cli/server/add.go +++ b/cli/server/add.go @@ -1,29 +1,88 @@ package server import ( - "fmt" + "context" + "os/user" + "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/client" "github.com/sirupsen/logrus" "github.com/urfave/cli/v2" ) var serverAddCommand = &cli.Command{ - Name: "add", - Usage: "Add a new server, reachable on .", - Aliases: []string{"a"}, - ArgsUsage: " [] []", - Description: "[], [] SSH connection details", + Name: "add", + Usage: "Add a new server", + Description: ` +This command adds a new server that abra will communicate with, to deploy apps. + +The argument must be a publicy accessible domain name which points to +your server. You should have SSH access to this server, Abra will assume port +22 and will use your current system username to make an initial connection. You +can use the and arguments to adjust this. + +For example: + + abra server add varia.zone 12345 glodemodem + +Abra will construct the following SSH connection string then: + + ssh://globemodem@varia.zone:12345 + +All communication between Abra and the server will use this SSH connection. + +`, + Aliases: []string{"a"}, + ArgsUsage: " [] []", Action: func(c *cli.Context) error { - argLen := c.Args().Len() - args := c.Args().Slice() - if argLen < 3 { - args = append(args, make([]string, 3-argLen)...) + domainName := internal.ValidateDomain(c) + + var username string + var port string + + username = c.Args().Get(1) + if username == "" { + systemUser, err := user.Current() + if err != nil { + logrus.Fatal(err) + } + username = systemUser.Username } - if err := client.CreateContext(args[0], args[1], args[2]); err != nil { + + port = c.Args().Get(2) + if port == "" { + port = "22" + } + + store := client.NewDefaultDockerContextStore() + contexts, err := store.Store.List() + if err != nil { logrus.Fatal(err) } - fmt.Println(args[0]) + + for _, context := range contexts { + if context.Name == domainName { + logrus.Fatalf("Server at '%s' already exists?", domainName) + } + } + + if err := client.CreateContext(domainName, username, port); err != nil { + logrus.Fatal(err) + } + + ctx := context.Background() + cl, err := client.New(domainName) + if err != nil { + logrus.Fatal(err) + } + + if _, err := cl.Info(ctx); err != nil { + logrus.Fatalf("Unable to make a connection to '%s'?", domainName) + logrus.Debug(err) + } + + logrus.Infof("Server at '%s' has been added", domainName) + return nil }, }