forked from toolshed/abra
Compare commits
1 Commits
better-err
...
integratio
Author | SHA1 | Date | |
---|---|---|---|
0a371ec360 |
@ -3,6 +3,7 @@ package app
|
|||||||
import (
|
import (
|
||||||
"context"
|
"context"
|
||||||
"fmt"
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
"coopcloud.tech/abra/cli/internal"
|
"coopcloud.tech/abra/cli/internal"
|
||||||
"coopcloud.tech/abra/pkg/app"
|
"coopcloud.tech/abra/pkg/app"
|
||||||
@ -275,6 +276,9 @@ func getDeployVersion(cliArgs []string, deployMeta stack.DeployMeta, app app.App
|
|||||||
|
|
||||||
// Check if the recipe has a version in the .env file
|
// Check if the recipe has a version in the .env file
|
||||||
if app.Recipe.EnvVersion != "" && !internal.IgnoreEnvVersion {
|
if app.Recipe.EnvVersion != "" && !internal.IgnoreEnvVersion {
|
||||||
|
if strings.HasSuffix(app.Recipe.EnvVersionRaw, "+U") {
|
||||||
|
return "", fmt.Errorf("version: can not redeploy chaos version %s", app.Recipe.EnvVersionRaw)
|
||||||
|
}
|
||||||
log.Debugf("version: taking version from .env file: %s", app.Recipe.EnvVersion)
|
log.Debugf("version: taking version from .env file: %s", app.Recipe.EnvVersion)
|
||||||
return app.Recipe.EnvVersion, nil
|
return app.Recipe.EnvVersion, nil
|
||||||
}
|
}
|
||||||
|
@ -242,7 +242,7 @@ func validateDowngradeVersionArg(
|
|||||||
) error {
|
) error {
|
||||||
parsedDeployedVersion, err := tagcmp.Parse(deployMeta.Version)
|
parsedDeployedVersion, err := tagcmp.Parse(deployMeta.Version)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return fmt.Errorf("'%s' is not a known version for %s", deployMeta.Version, app.Recipe.Name)
|
return fmt.Errorf("current deployment '%s' is not a known version for %s", deployMeta.Version, app.Recipe.Name)
|
||||||
}
|
}
|
||||||
|
|
||||||
parsedSpecificVersion, err := tagcmp.Parse(specificVersion)
|
parsedSpecificVersion, err := tagcmp.Parse(specificVersion)
|
||||||
|
@ -1,64 +0,0 @@
|
|||||||
package internal
|
|
||||||
|
|
||||||
import (
|
|
||||||
"fmt"
|
|
||||||
"runtime"
|
|
||||||
|
|
||||||
"github.com/charmbracelet/log"
|
|
||||||
)
|
|
||||||
|
|
||||||
func Error(msg string) HelpError {
|
|
||||||
caller := ""
|
|
||||||
if Debug {
|
|
||||||
_, file, line, _ := runtime.Caller(1)
|
|
||||||
caller = log.ShortCallerFormatter(file, line, "")
|
|
||||||
|
|
||||||
}
|
|
||||||
return HelpError{err: msg, caller: caller}
|
|
||||||
}
|
|
||||||
|
|
||||||
func Errorf(format string, a ...any) HelpError {
|
|
||||||
caller := ""
|
|
||||||
if Debug {
|
|
||||||
_, file, line, _ := runtime.Caller(1)
|
|
||||||
caller = log.ShortCallerFormatter(file, line, "")
|
|
||||||
|
|
||||||
}
|
|
||||||
return HelpError{err: fmt.Sprintf(format, a...), caller: caller}
|
|
||||||
}
|
|
||||||
|
|
||||||
type HelpError struct {
|
|
||||||
err string
|
|
||||||
caller string
|
|
||||||
help string
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e HelpError) Help(help string) HelpError {
|
|
||||||
e.help = help
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e HelpError) Helpf(format string, a ...any) HelpError {
|
|
||||||
e.help = fmt.Sprintf(format, a...)
|
|
||||||
return e
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e HelpError) Error() string {
|
|
||||||
return e.format()
|
|
||||||
}
|
|
||||||
|
|
||||||
func (e HelpError) format() string {
|
|
||||||
msg := ""
|
|
||||||
if e.caller != "" {
|
|
||||||
msg += fmt.Sprintf("<%s> ", e.caller)
|
|
||||||
}
|
|
||||||
|
|
||||||
msg += e.err
|
|
||||||
if e.help == "" {
|
|
||||||
return msg
|
|
||||||
}
|
|
||||||
|
|
||||||
return fmt.Sprintf(`%s
|
|
||||||
|
|
||||||
Help: %s `, msg, e.help)
|
|
||||||
}
|
|
16
cli/run.go
16
cli/run.go
@ -3,7 +3,6 @@ package cli
|
|||||||
import (
|
import (
|
||||||
"fmt"
|
"fmt"
|
||||||
"os"
|
"os"
|
||||||
"strings"
|
|
||||||
|
|
||||||
"coopcloud.tech/abra/cli/app"
|
"coopcloud.tech/abra/cli/app"
|
||||||
"coopcloud.tech/abra/cli/catalogue"
|
"coopcloud.tech/abra/cli/catalogue"
|
||||||
@ -41,7 +40,7 @@ func Run(version, commit string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
for _, path := range paths {
|
for _, path := range paths {
|
||||||
if err := os.Mkdir(path, 0o764); err != nil {
|
if err := os.Mkdir(path, 0764); err != nil {
|
||||||
if !os.IsExist(err) {
|
if !os.IsExist(err) {
|
||||||
log.Fatal(err)
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
@ -67,9 +66,6 @@ func Run(version, commit string) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
rootCmd.CompletionOptions.DisableDefaultCmd = true
|
||||||
// We handle errors ourself
|
|
||||||
rootCmd.SilenceUsage = true
|
|
||||||
rootCmd.SilenceErrors = true
|
|
||||||
|
|
||||||
manCommand := &cobra.Command{
|
manCommand := &cobra.Command{
|
||||||
Use: "man [flags]",
|
Use: "man [flags]",
|
||||||
@ -216,15 +212,7 @@ func Run(version, commit string) {
|
|||||||
app.AppEnvCommand,
|
app.AppEnvCommand,
|
||||||
)
|
)
|
||||||
|
|
||||||
if cmd, err := rootCmd.ExecuteC(); err != nil {
|
if err := rootCmd.Execute(); err != nil {
|
||||||
fmt.Printf("Error: %s\n", err)
|
|
||||||
if strings.HasPrefix(err.Error(), "unknown flag") {
|
|
||||||
fmt.Println()
|
|
||||||
cmd.Usage()
|
|
||||||
} else if !internal.Debug {
|
|
||||||
fmt.Println()
|
|
||||||
fmt.Printf("Run with --debug for more info.\n")
|
|
||||||
}
|
|
||||||
os.Exit(1)
|
os.Exit(1)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,8 +1,6 @@
|
|||||||
package server
|
package server
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
|
|
||||||
@ -43,20 +41,19 @@ developer machine. The domain is then set to "default".`,
|
|||||||
ValidArgsFunction: func(
|
ValidArgsFunction: func(
|
||||||
cmd *cobra.Command,
|
cmd *cobra.Command,
|
||||||
args []string,
|
args []string,
|
||||||
toComplete string,
|
toComplete string) ([]string, cobra.ShellCompDirective) {
|
||||||
) ([]string, cobra.ShellCompDirective) {
|
|
||||||
if !local {
|
if !local {
|
||||||
return autocomplete.ServerNameComplete()
|
return autocomplete.ServerNameComplete()
|
||||||
}
|
}
|
||||||
return nil, cobra.ShellCompDirectiveDefault
|
return nil, cobra.ShellCompDirectiveDefault
|
||||||
},
|
},
|
||||||
RunE: func(cmd *cobra.Command, args []string) error {
|
Run: func(cmd *cobra.Command, args []string) {
|
||||||
if len(args) > 0 && local {
|
if len(args) > 0 && local {
|
||||||
return errors.New("cannot use [server] and --local together")
|
log.Fatal("cannot use [server] and --local together")
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(args) == 0 && !local {
|
if len(args) == 0 && !local {
|
||||||
return errors.New("missing argument or --local/-l flag")
|
log.Fatal("missing argument or --local/-l flag")
|
||||||
}
|
}
|
||||||
|
|
||||||
name := "default"
|
name := "default"
|
||||||
@ -72,14 +69,14 @@ developer machine. The domain is then set to "default".`,
|
|||||||
if local {
|
if local {
|
||||||
created, err := createServerDir(name)
|
created, err := createServerDir(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("attempting to create client for %s", name)
|
log.Debugf("attempting to create client for %s", name)
|
||||||
|
|
||||||
if _, err := client.New(name, timeout); err != nil {
|
if _, err := client.New(name, timeout); err != nil {
|
||||||
cleanUp(name)
|
cleanUp(name)
|
||||||
return err
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
if created {
|
if created {
|
||||||
@ -88,18 +85,18 @@ developer machine. The domain is then set to "default".`,
|
|||||||
log.Warn("local server already exists")
|
log.Warn("local server already exists")
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
_, err := createServerDir(name)
|
_, err := createServerDir(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
log.Fatal(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
created, err := newContext(name)
|
created, err := newContext(name)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
cleanUp(name)
|
cleanUp(name)
|
||||||
return fmt.Errorf("unable to create local context: %s", err)
|
log.Fatalf("unable to create local context: %s", err)
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Debugf("attempting to create client for %s", name)
|
log.Debugf("attempting to create client for %s", name)
|
||||||
@ -107,7 +104,7 @@ developer machine. The domain is then set to "default".`,
|
|||||||
if _, err := client.New(name, timeout); err != nil {
|
if _, err := client.New(name, timeout); err != nil {
|
||||||
cleanUp(name)
|
cleanUp(name)
|
||||||
log.Debugf("ssh %s error: %s", name, sshPkg.Fatal(name, err))
|
log.Debugf("ssh %s error: %s", name, sshPkg.Fatal(name, err))
|
||||||
return internal.Errorf("can't ssh to %s", name).Helpf("make sure \"ssh %s\" works", name)
|
log.Fatalf("can't ssh to %s, make sure \"ssh %s\" works", name, name)
|
||||||
}
|
}
|
||||||
|
|
||||||
if created {
|
if created {
|
||||||
@ -117,11 +114,10 @@ developer machine. The domain is then set to "default".`,
|
|||||||
log.Warnf("unable to resolve IPv4 for %s", name)
|
log.Warnf("unable to resolve IPv4 for %s", name)
|
||||||
}
|
}
|
||||||
|
|
||||||
return nil
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
log.Warnf("%s already exists", name)
|
log.Warnf("%s already exists", name)
|
||||||
return nil
|
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -193,7 +189,9 @@ func createServerDir(name string) (bool, error) {
|
|||||||
return true, nil
|
return true, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
var local bool
|
var (
|
||||||
|
local bool
|
||||||
|
)
|
||||||
|
|
||||||
func init() {
|
func init() {
|
||||||
ServerAddCommand.Flags().BoolVarP(
|
ServerAddCommand.Flags().BoolVarP(
|
||||||
|
@ -154,7 +154,7 @@ teardown(){
|
|||||||
assert_not_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
|
assert_not_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo"
|
||||||
|
|
||||||
run $ABRA app deploy "$TEST_APP_DOMAIN" \
|
run $ABRA app deploy "$TEST_APP_DOMAIN" \
|
||||||
--no-input --no-converge-checks --force
|
--no-input --no-converge-checks --force --debug
|
||||||
assert_failure
|
assert_failure
|
||||||
assert_output --regexp 'can not redeploy chaos version .*' + "${headHash:0:8}+U"
|
assert_output --regexp 'can not redeploy chaos version .*' + "${headHash:0:8}+U"
|
||||||
}
|
}
|
||||||
@ -249,7 +249,7 @@ teardown(){
|
|||||||
--no-input --no-converge-checks --force
|
--no-input --no-converge-checks --force
|
||||||
assert_success
|
assert_success
|
||||||
|
|
||||||
assert_output --partial 'CHAOS DEPLOY OVERVIEW'
|
assert_output --partial 'REDEPLOY OVERVIEW'
|
||||||
assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}"
|
assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}"
|
||||||
assert_output --partial "ENV VERSION ${headHash:0:8}"
|
assert_output --partial "ENV VERSION ${headHash:0:8}"
|
||||||
assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}"
|
assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}"
|
||||||
|
@ -164,8 +164,7 @@ teardown(){
|
|||||||
|
|
||||||
run $ABRA app rollback "$TEST_APP_DOMAIN" "0.1.1+1.20.2" --no-input --no-converge-checks
|
run $ABRA app rollback "$TEST_APP_DOMAIN" "0.1.1+1.20.2" --no-input --no-converge-checks
|
||||||
assert_failure
|
assert_failure
|
||||||
assert_output --partial "0.1.1+1.20.2"
|
assert_output --partial 'current deployment' + "${tagHash:0:8}" + 'is not a known version'
|
||||||
assert_output --partial "${tagHash:0:8}" + 'is not a known version'
|
|
||||||
}
|
}
|
||||||
|
|
||||||
# bats test_tags=slow
|
# bats test_tags=slow
|
||||||
|
Reference in New Issue
Block a user