2021-09-04 23:55:10 +00:00
|
|
|
package internal
|
|
|
|
|
|
|
|
import (
|
|
|
|
"errors"
|
2021-11-02 13:08:54 +00:00
|
|
|
"strings"
|
2021-09-04 23:55:10 +00:00
|
|
|
|
2021-09-05 21:17:35 +00:00
|
|
|
"coopcloud.tech/abra/pkg/app"
|
2021-10-22 06:21:46 +00:00
|
|
|
"coopcloud.tech/abra/pkg/catalogue"
|
2021-09-05 20:04:48 +00:00
|
|
|
"coopcloud.tech/abra/pkg/config"
|
2021-09-05 19:37:03 +00:00
|
|
|
"coopcloud.tech/abra/pkg/recipe"
|
2021-11-09 16:43:24 +00:00
|
|
|
"coopcloud.tech/abra/pkg/ssh"
|
2021-10-22 06:21:46 +00:00
|
|
|
"github.com/AlecAivazis/survey/v2"
|
2021-09-04 23:55:10 +00:00
|
|
|
"github.com/sirupsen/logrus"
|
|
|
|
"github.com/urfave/cli/v2"
|
|
|
|
)
|
|
|
|
|
2021-11-03 08:20:40 +00:00
|
|
|
// AppName is used for configuring app name programmatically
|
|
|
|
var AppName string
|
|
|
|
|
2021-09-05 22:45:13 +00:00
|
|
|
// ValidateRecipe ensures the recipe arg is valid.
|
2021-09-05 23:41:16 +00:00
|
|
|
func ValidateRecipe(c *cli.Context) recipe.Recipe {
|
2021-09-04 23:55:10 +00:00
|
|
|
recipeName := c.Args().First()
|
|
|
|
|
|
|
|
if recipeName == "" {
|
|
|
|
ShowSubcommandHelpAndError(c, errors.New("no recipe provided"))
|
|
|
|
}
|
|
|
|
|
2021-09-05 23:41:16 +00:00
|
|
|
recipe, err := recipe.Get(recipeName)
|
|
|
|
if err != nil {
|
2021-09-04 23:55:10 +00:00
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-09-10 22:54:02 +00:00
|
|
|
logrus.Debugf("validated '%s' as recipe argument", recipeName)
|
|
|
|
|
2021-09-05 23:41:16 +00:00
|
|
|
return recipe
|
2021-09-04 23:55:10 +00:00
|
|
|
}
|
2021-09-05 20:04:48 +00:00
|
|
|
|
2021-10-22 06:21:46 +00:00
|
|
|
// ValidateRecipeWithPrompt ensures a recipe argument is present before
|
|
|
|
// validating, asking for input if required.
|
|
|
|
func ValidateRecipeWithPrompt(c *cli.Context) recipe.Recipe {
|
|
|
|
recipeName := c.Args().First()
|
|
|
|
|
|
|
|
if recipeName == "" && !NoInput {
|
|
|
|
catl, err := catalogue.ReadRecipeCatalogue()
|
|
|
|
if err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
var recipes []string
|
|
|
|
for name := range catl {
|
|
|
|
recipes = append(recipes, name)
|
|
|
|
}
|
|
|
|
prompt := &survey.Select{
|
|
|
|
Message: "Select recipe",
|
|
|
|
Options: recipes,
|
|
|
|
}
|
|
|
|
if err := survey.AskOne(prompt, &recipeName); err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
2021-11-02 12:33:46 +00:00
|
|
|
}
|
|
|
|
|
2021-11-03 08:41:20 +00:00
|
|
|
if RecipeName != "" {
|
2021-11-03 08:10:13 +00:00
|
|
|
recipeName = RecipeName
|
|
|
|
logrus.Debugf("programmatically setting recipe name to %s", recipeName)
|
|
|
|
}
|
|
|
|
|
2021-11-03 08:20:40 +00:00
|
|
|
if recipeName == "" {
|
2021-10-22 06:21:46 +00:00
|
|
|
ShowSubcommandHelpAndError(c, errors.New("no recipe provided"))
|
|
|
|
}
|
|
|
|
|
|
|
|
recipe, err := recipe.Get(recipeName)
|
|
|
|
if err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
|
|
|
|
logrus.Debugf("validated '%s' as recipe argument", recipeName)
|
|
|
|
|
|
|
|
return recipe
|
|
|
|
}
|
|
|
|
|
2021-09-05 22:26:45 +00:00
|
|
|
// ValidateApp ensures the app name arg is valid.
|
2021-09-05 21:17:35 +00:00
|
|
|
func ValidateApp(c *cli.Context) config.App {
|
2021-09-05 20:04:48 +00:00
|
|
|
appName := c.Args().First()
|
|
|
|
|
2021-11-03 08:41:20 +00:00
|
|
|
if AppName != "" {
|
2021-11-03 08:20:40 +00:00
|
|
|
appName = AppName
|
|
|
|
logrus.Debugf("programmatically setting app name to %s", appName)
|
|
|
|
}
|
|
|
|
|
2021-09-05 20:04:48 +00:00
|
|
|
if appName == "" {
|
|
|
|
ShowSubcommandHelpAndError(c, errors.New("no app provided"))
|
|
|
|
}
|
|
|
|
|
2021-09-05 21:17:35 +00:00
|
|
|
app, err := app.Get(appName)
|
2021-09-05 20:04:48 +00:00
|
|
|
if err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-10-10 22:34:23 +00:00
|
|
|
if err := recipe.EnsureExists(app.Type); err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-11-09 16:43:24 +00:00
|
|
|
if err := ssh.EnsureHostKey(app.Server); err != nil {
|
|
|
|
logrus.Fatal(err)
|
|
|
|
}
|
|
|
|
|
2021-09-10 22:54:02 +00:00
|
|
|
logrus.Debugf("validated '%s' as app argument", appName)
|
|
|
|
|
2021-09-05 21:17:35 +00:00
|
|
|
return app
|
2021-09-05 20:04:48 +00:00
|
|
|
}
|
2021-09-10 12:49:25 +00:00
|
|
|
|
|
|
|
// ValidateDomain ensures the domain name arg is valid.
|
2021-10-25 07:02:24 +00:00
|
|
|
func ValidateDomain(c *cli.Context) (string, error) {
|
2021-09-10 12:49:25 +00:00
|
|
|
domainName := c.Args().First()
|
|
|
|
|
2021-10-25 07:02:24 +00:00
|
|
|
if domainName == "" && !NoInput {
|
|
|
|
prompt := &survey.Input{
|
|
|
|
Message: "Specify a domain name",
|
|
|
|
Default: "example.com",
|
|
|
|
}
|
|
|
|
if err := survey.AskOne(prompt, &domainName); err != nil {
|
|
|
|
return domainName, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2021-09-10 12:49:25 +00:00
|
|
|
if domainName == "" {
|
|
|
|
ShowSubcommandHelpAndError(c, errors.New("no domain provided"))
|
|
|
|
}
|
|
|
|
|
2021-09-10 22:54:02 +00:00
|
|
|
logrus.Debugf("validated '%s' as domain argument", domainName)
|
|
|
|
|
2021-10-25 07:02:24 +00:00
|
|
|
return domainName, nil
|
2021-09-10 12:49:25 +00:00
|
|
|
}
|
2021-11-02 13:08:54 +00:00
|
|
|
|
|
|
|
// ValidateSubCmdFlags ensures flag order conforms to correct order
|
|
|
|
func ValidateSubCmdFlags(c *cli.Context) bool {
|
|
|
|
for argIdx, arg := range c.Args().Slice() {
|
|
|
|
if !strings.HasPrefix(arg, "--") {
|
|
|
|
for _, flag := range c.Args().Slice()[argIdx:] {
|
|
|
|
if strings.HasPrefix(flag, "--") {
|
|
|
|
return false
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return true
|
|
|
|
}
|
2021-11-03 07:34:36 +00:00
|
|
|
|
|
|
|
// ValidateServer ensures the server name arg is valid.
|
|
|
|
func ValidateServer(c *cli.Context) (string, error) {
|
|
|
|
serverName := c.Args().First()
|
|
|
|
|
|
|
|
serverNames, err := config.ReadServerNames()
|
|
|
|
if err != nil {
|
|
|
|
return serverName, err
|
|
|
|
}
|
|
|
|
|
|
|
|
if serverName == "" && !NoInput {
|
|
|
|
prompt := &survey.Select{
|
|
|
|
Message: "Specify a server name",
|
|
|
|
Options: serverNames,
|
|
|
|
}
|
|
|
|
if err := survey.AskOne(prompt, &serverName); err != nil {
|
|
|
|
return serverName, err
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if serverName == "" {
|
|
|
|
ShowSubcommandHelpAndError(c, errors.New("no server provided"))
|
|
|
|
}
|
|
|
|
|
|
|
|
logrus.Debugf("validated '%s' as server argument", serverName)
|
|
|
|
|
|
|
|
return serverName, nil
|
|
|
|
}
|