From e58a716fe1e688cd348e7eaa35f7c2aa3b7c8cde Mon Sep 17 00:00:00 2001 From: p4u1 Date: Wed, 12 Mar 2025 16:13:24 +0000 Subject: [PATCH] feat(deploy): Simplifies deploy overview (#508) This simplifies the deploy overview, to only show 3 version fields: - CURRENT DEPLOYMENT - CURRENT ENV - NEW DEPLOYMENT It also fixes a few errors around version detection Reviewed-on: https://git.coopcloud.tech/toolshed/abra/pulls/508 Co-authored-by: p4u1 Co-committed-by: p4u1 --- cli/app/deploy.go | 107 +++------ cli/app/new.go | 11 +- cli/app/rollback.go | 11 +- cli/app/undeploy.go | 19 +- cli/app/upgrade.go | 29 ++- cli/internal/deploy.go | 220 +++---------------- pkg/app/app.go | 13 -- pkg/app/app_test.go | 12 - pkg/app/compose.go | 10 + pkg/recipe/git.go | 25 ++- pkg/recipe/git_test.go | 9 +- pkg/recipe/recipe.go | 47 ++-- pkg/recipe/recipe_test.go | 30 +-- tests/integration/app_deploy.bats | 15 +- tests/integration/app_deploy_overview.bats | 176 +++++---------- tests/integration/app_rollback.bats | 14 +- tests/integration/app_rollback_overview.bats | 46 ++-- tests/integration/app_undeploy.bats | 3 - tests/integration/app_undeploy_overview.bats | 34 +-- tests/integration/app_upgrade.bats | 15 +- tests/integration/app_upgrade_overview.bats | 47 ++-- tests/integration/helpers/app.bash | 9 + tests/integration/helpers/git.bash | 2 + 23 files changed, 263 insertions(+), 641 deletions(-) diff --git a/cli/app/deploy.go b/cli/app/deploy.go index c2cef8bd..42ee02f8 100644 --- a/cli/app/deploy.go +++ b/cli/app/deploy.go @@ -64,10 +64,8 @@ checkout as-is. Recipe commit hashes are also supported as values for }, Run: func(cmd *cobra.Command, args []string) { var ( - deployWarnMessages []string - toDeployVersion string - isChaosCommit bool - toDeployChaosVersion = config.CHAOS_DEFAULT + deployWarnMessages []string + toDeployVersion string ) app := internal.ValidateApp(args) @@ -80,10 +78,6 @@ checkout as-is. Recipe commit hashes are also supported as values for log.Fatal(err) } - if err := lint.LintForErrors(app.Recipe); err != nil { - log.Fatal(err) - } - cl, err := client.New(app.Server) if err != nil { log.Fatal(err) @@ -100,28 +94,20 @@ checkout as-is. Recipe commit hashes are also supported as values for log.Fatalf("%s is already deployed", app.Name) } - toDeployVersion, toDeployChaosVersion, err = getDeployVersion(args, deployMeta, app) + toDeployVersion, err = getDeployVersion(args, deployMeta, app) if err != nil { - log.Fatal(err) + log.Fatal(fmt.Errorf("get deploy version: %s", err)) } if !internal.Chaos { - isChaosCommit, err = app.Recipe.EnsureVersion(toDeployVersion) + _, err = app.Recipe.EnsureVersion(toDeployVersion) if err != nil { - log.Fatal(err) + log.Fatalf("ensure recipe: %s", err) } + } - if isChaosCommit { - log.Debugf("assuming chaos commit: %s", toDeployVersion) - - internal.Chaos = true - toDeployChaosVersion = toDeployVersion - - toDeployVersion, err = app.Recipe.GetVersionLabelLocal() - if err != nil { - log.Fatal(err) - } - } + if err := lint.LintForErrors(app.Recipe); err != nil { + log.Fatal(err) } if err := validateSecrets(cl, app); err != nil { @@ -154,18 +140,14 @@ checkout as-is. Recipe commit hashes are also supported as values for log.Fatal(err) } - toDeployChaosVersionLabel := toDeployChaosVersion - if app.Recipe.Dirty { - toDeployChaosVersionLabel = formatter.AddDirtyMarker(toDeployChaosVersionLabel) - } - appPkg.ExposeAllEnv(stackName, compose, app.Env) appPkg.SetRecipeLabel(compose, stackName, app.Recipe.Name) appPkg.SetChaosLabel(compose, stackName, internal.Chaos) if internal.Chaos { - appPkg.SetChaosVersionLabel(compose, stackName, toDeployChaosVersionLabel) + appPkg.SetChaosVersionLabel(compose, stackName, toDeployVersion) } appPkg.SetUpdateLabel(compose, stackName, app.Env) + appPkg.SetVersionLabel(compose, stackName, toDeployVersion) envVars, err := appPkg.CheckEnv(app) if err != nil { @@ -197,19 +179,12 @@ checkout as-is. Recipe commit hashes are also supported as values for deployedVersion = deployMeta.Version } - toWriteVersion := toDeployVersion - if internal.Chaos || isChaosCommit { - toWriteVersion = toDeployChaosVersion - } - if err := internal.DeployOverview( app, - deployWarnMessages, deployedVersion, - deployMeta.ChaosVersion, toDeployVersion, - toDeployChaosVersion, - toWriteVersion, + "", + deployWarnMessages, ); err != nil { log.Fatal(err) } @@ -233,43 +208,28 @@ checkout as-is. Recipe commit hashes are also supported as values for } } - if err := app.WriteRecipeVersion(toWriteVersion, false); err != nil { + if err := app.WriteRecipeVersion(toDeployVersion, false); err != nil { log.Fatalf("writing recipe version failed: %s", err) } }, } -func getChaosVersion(app app.App, toDeployVersion, toDeployChaosVersion *string) error { - var err error - *toDeployChaosVersion, err = app.Recipe.ChaosVersion() - if err != nil { - return err - } - - *toDeployVersion, err = app.Recipe.GetVersionLabelLocal() - if err != nil { - return err - } - - return nil -} - -func getLatestVersionOrCommit(app app.App) (string, string, error) { +func getLatestVersionOrCommit(app app.App) (string, error) { versions, err := app.Recipe.Tags() if err != nil { - return "", "", err + return "", err } if len(versions) > 0 && !internal.Chaos { - return versions[len(versions)-1], "", nil + return versions[len(versions)-1], nil } head, err := app.Recipe.Head() if err != nil { - return "", "", err + return "", err } - return "", formatter.SmallSHA(head.String()), nil + return formatter.SmallSHA(head.String()), nil } // validateArgsAndFlags ensures compatible args/flags. @@ -296,48 +256,41 @@ func validateSecrets(cl *dockerClient.Client, app app.App) error { return nil } -func getDeployVersion(cliArgs []string, deployMeta stack.DeployMeta, app app.App) (string, string, error) { +func getDeployVersion(cliArgs []string, deployMeta stack.DeployMeta, app app.App) (string, error) { // Chaos mode overrides everything if internal.Chaos { v, err := app.Recipe.ChaosVersion() if err != nil { - return "", "", err + return "", err } - cv, err := app.Recipe.GetVersionLabelLocal() - if err != nil { - return "", "", err - } - log.Debugf("version: taking chaos version: %s, %s", v, cv) - return v, cv, nil + log.Debugf("version: taking chaos version: %s", v) + return v, nil } // Check if the deploy version is set with a cli argument if len(cliArgs) == 2 && cliArgs[1] != "" { log.Debugf("version: taking version from cli arg: %s", cliArgs[1]) - return cliArgs[1], "", nil + return cliArgs[1], nil } // Check if the recipe has a version in the .env file if app.Recipe.EnvVersion != "" && !internal.IgnoreEnvVersion { log.Debugf("version: taking version from .env file: %s", app.Recipe.EnvVersion) - return app.Recipe.EnvVersion, "", nil + return app.Recipe.EnvVersion, nil } // Take deployed version if deployMeta.IsDeployed { log.Debugf("version: taking deployed version: %s", deployMeta.Version) - return deployMeta.Version, "", nil + return deployMeta.Version, nil } - v, vc, err := getLatestVersionOrCommit(app) - log.Debugf("version: taking new recipe versio: %s, %s", v, vc) + v, err := getLatestVersionOrCommit(app) + log.Debugf("version: taking new recipe version: %s", v) if err != nil { - log.Fatal(err) + return "", err } - if v == "" { - return vc, vc, nil - } - return v, vc, nil + return v, nil } func init() { diff --git a/cli/app/new.go b/cli/app/new.go index 00c21bf5..88ada695 100644 --- a/cli/app/new.go +++ b/cli/app/new.go @@ -209,16 +209,7 @@ var AppNewCommand = &cobra.Command{ log.Fatal(err) } - if err := app.Recipe.IsDirty(); err != nil { - log.Fatal(err) - } - - toWriteVersion := recipeVersion - if internal.Chaos || app.Recipe.Dirty { - toWriteVersion = chaosVersion - } - - if err := app.WriteRecipeVersion(toWriteVersion, false); err != nil { + if err := app.WriteRecipeVersion(recipeVersion, false); err != nil { log.Fatalf("writing recipe version failed: %s", err) } }, diff --git a/cli/app/rollback.go b/cli/app/rollback.go index 9adc854e..f556735e 100644 --- a/cli/app/rollback.go +++ b/cli/app/rollback.go @@ -183,20 +183,13 @@ beforehand. See "abra app backup" for more.`, } appPkg.SetUpdateLabel(compose, stackName, app.Env) - chaosVersion := config.CHAOS_DEFAULT - if deployMeta.IsChaos { - chaosVersion = deployMeta.ChaosVersion - } - // NOTE(d1): no release notes implemeneted for rolling back - if err := internal.NewVersionOverview( + if err := internal.DeployOverview( app, - downgradeWarnMessages, - "rollback", deployMeta.Version, - chaosVersion, chosenDowngrade, "", + downgradeWarnMessages, ); err != nil { log.Fatal(err) } diff --git a/cli/app/undeploy.go b/cli/app/undeploy.go index 4fa1f499..21e6aadf 100644 --- a/cli/app/undeploy.go +++ b/cli/app/undeploy.go @@ -54,21 +54,12 @@ Passing "--prune/-p" does not remove those volumes.`, log.Fatalf("%s is not deployed?", app.Name) } - chaosVersion := config.CHAOS_DEFAULT - if deployMeta.IsChaos { - chaosVersion = deployMeta.ChaosVersion - } - - toWriteVersion := deployMeta.Version - if deployMeta.IsChaos { - toWriteVersion = chaosVersion - } - - if err := internal.UndeployOverview( + if err := internal.DeployOverview( app, deployMeta.Version, - chaosVersion, - toWriteVersion, + config.NO_DOMAIN_DEFAULT, + "", + nil, ); err != nil { log.Fatal(err) } @@ -87,7 +78,7 @@ Passing "--prune/-p" does not remove those volumes.`, } } - if err := app.WriteRecipeVersion(toWriteVersion, false); err != nil { + if err := app.WriteRecipeVersion(deployMeta.Version, false); err != nil { log.Fatalf("writing recipe version failed: %s", err) } }, diff --git a/cli/app/upgrade.go b/cli/app/upgrade.go index ce116c04..d05510e1 100644 --- a/cli/app/upgrade.go +++ b/cli/app/upgrade.go @@ -43,7 +43,8 @@ beforehand. See "abra app backup" for more.`, ValidArgsFunction: func( cmd *cobra.Command, args []string, - toComplete string) ([]string, cobra.ShellCompDirective) { + toComplete string, + ) ([]string, cobra.ShellCompDirective) { switch l := len(args); l { case 0: return autocomplete.AppNameComplete() @@ -206,23 +207,21 @@ beforehand. See "abra app backup" for more.`, return } - chaosVersion := config.CHAOS_DEFAULT - if deployMeta.IsChaos { - chaosVersion = deployMeta.ChaosVersion - - if deployMeta.ChaosVersion == "" { - chaosVersion = config.UNKNOWN_DEFAULT - } + if upgradeReleaseNotes != "" && chosenUpgrade != "" { + fmt.Print(upgradeReleaseNotes) + } else { + upgradeWarnMessages = append( + upgradeWarnMessages, + fmt.Sprintf("no release notes available for %s", chosenUpgrade), + ) } - if err := internal.NewVersionOverview( + if err := internal.DeployOverview( app, - upgradeWarnMessages, - "upgrade", deployMeta.Version, - chaosVersion, chosenUpgrade, upgradeReleaseNotes, + upgradeWarnMessages, ); err != nil { log.Fatal(err) } @@ -365,7 +364,7 @@ func validateUpgradeVersionArg( parsedDeployedVersion, err := tagcmp.Parse(deployMeta.Version) if err != nil { - return err + return fmt.Errorf("'%s' is not a known version", deployMeta.Version) } if parsedSpecificVersion.IsLessThan(parsedDeployedVersion) && @@ -397,9 +396,7 @@ func ensureDeployed(cl *dockerClient.Client, app app.App) (stack.DeployMeta, err return deployMeta, nil } -var ( - showReleaseNotes bool -) +var showReleaseNotes bool func init() { AppUpgradeCommand.Flags().BoolVarP( diff --git a/cli/internal/deploy.go b/cli/internal/deploy.go index 6cbe7edd..1690a958 100644 --- a/cli/internal/deploy.go +++ b/cli/internal/deploy.go @@ -10,7 +10,6 @@ import ( "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/formatter" "coopcloud.tech/abra/pkg/log" - "coopcloud.tech/abra/pkg/recipe" "coopcloud.tech/tagcmp" "github.com/AlecAivazis/survey/v2" "github.com/charmbracelet/lipgloss" @@ -38,96 +37,6 @@ func horizontal(left, mid, right string) string { return lipgloss.JoinHorizontal(lipgloss.Left, left, mid, right) } -// NewVersionOverview shows an upgrade or downgrade overview -func NewVersionOverview( - app appPkg.App, - warnMessages []string, - kind, - deployedVersion, - deployedChaosVersion, - toDeployVersion, - releaseNotes string) error { - deployConfig := "compose.yml" - if composeFiles, ok := app.Env["COMPOSE_FILE"]; ok { - deployConfig = formatComposeFiles(composeFiles) - } - - server := app.Server - if app.Server == "default" { - server = "local" - } - - domain := app.Domain - if domain == "" { - domain = config.NO_DOMAIN_DEFAULT - } - - upperKind := strings.ToUpper(kind) - - envVersion, err := recipe.GetEnvVersionRaw(app.Recipe.Name) - if err != nil { - return err - } - - if envVersion == "" { - envVersion = config.NO_VERSION_DEFAULT - } - - rows := [][]string{ - {"DOMAIN", domain}, - {"RECIPE", app.Recipe.Name}, - {"SERVER", server}, - {"CONFIG", deployConfig}, - - {"CURRENT DEPLOYMENT", "---"}, - {"VERSION", formatter.BoldDirtyDefault(deployedVersion)}, - {"CHAOS ", formatter.BoldDirtyDefault(deployedChaosVersion)}, - - {upperKind, "---"}, - {"VERSION", formatter.BoldDirtyDefault(toDeployVersion)}, - - {fmt.Sprintf("%s.ENV", strings.ToUpper(app.Domain)), "---"}, - {"CURRENT VERSION", formatter.BoldDirtyDefault(envVersion)}, - {"NEW VERSION", formatter.BoldDirtyDefault(toDeployVersion)}, - } - - overview := formatter.CreateOverview( - fmt.Sprintf("%s OVERVIEW", upperKind), - rows, - ) - - fmt.Println(overview) - - if releaseNotes != "" && toDeployVersion != "" { - fmt.Print(releaseNotes) - } else { - warnMessages = append( - warnMessages, - fmt.Sprintf("no release notes available for %s", toDeployVersion), - ) - } - - for _, msg := range warnMessages { - log.Warn(msg) - } - - if NoInput { - return nil - } - - response := false - prompt := &survey.Confirm{Message: "proceed?"} - if err := survey.AskOne(prompt, &response); err != nil { - return err - } - - if !response { - log.Fatal("deployment cancelled") - } - - return nil -} - func formatComposeFiles(composeFiles string) string { return strings.ReplaceAll(composeFiles, ":", "\n") } @@ -135,12 +44,10 @@ func formatComposeFiles(composeFiles string) string { // DeployOverview shows a deployment overview func DeployOverview( app appPkg.App, - warnMessages []string, deployedVersion string, - deployedChaosVersion string, - toDeployVersion, - toDeployChaosVersion string, - toWriteVersion string, + toDeployVersion string, + info string, + warnMessages []string, ) error { deployConfig := "compose.yml" if composeFiles, ok := app.Env["COMPOSE_FILE"]; ok { @@ -157,21 +64,7 @@ func DeployOverview( domain = config.NO_DOMAIN_DEFAULT } - if app.Recipe.Dirty { - toWriteVersion = formatter.AddDirtyMarker(toWriteVersion) - toDeployChaosVersion = formatter.AddDirtyMarker(toDeployChaosVersion) - } - - recipeName, exists := app.Env["RECIPE"] - if !exists { - recipeName = app.Env["TYPE"] - } - - envVersion, err := recipe.GetEnvVersionRaw(recipeName) - if err != nil { - return err - } - + envVersion := app.Recipe.EnvVersionRaw if envVersion == "" { envVersion = config.NO_VERSION_DEFAULT } @@ -181,24 +74,21 @@ func DeployOverview( {"RECIPE", app.Recipe.Name}, {"SERVER", server}, {"CONFIG", deployConfig}, - - {"CURRENT DEPLOYMENT", "---"}, - {"VERSION", formatter.BoldDirtyDefault(deployedVersion)}, - {"CHAOS", formatter.BoldDirtyDefault(deployedChaosVersion)}, - - {"NEW DEPLOYMENT", "---"}, - {"VERSION", formatter.BoldDirtyDefault(toDeployVersion)}, - {"CHAOS", formatter.BoldDirtyDefault(toDeployChaosVersion)}, - - {fmt.Sprintf("%s.ENV", strings.ToUpper(app.Name)), "---"}, - {"CURRENT VERSION", formatter.BoldDirtyDefault(envVersion)}, - {"NEW VERSION", formatter.BoldDirtyDefault(toWriteVersion)}, + {"", ""}, + {"CURRENT DEPLOYMENT", formatter.BoldDirtyDefault(deployedVersion)}, + {"ENV VERSION", formatter.BoldDirtyDefault(envVersion)}, + {"NEW DEPLOYMENT", formatter.BoldDirtyDefault(toDeployVersion)}, } - overview := formatter.CreateOverview("DEPLOY OVERVIEW", rows) + deployType := getDeployType(deployedVersion, toDeployVersion) + overview := formatter.CreateOverview(fmt.Sprintf("%s OVERVIEW", deployType), rows) fmt.Println(overview) + if info != "" { + fmt.Println(info) + } + for _, msg := range warnMessages { log.Warn(msg) } @@ -220,76 +110,34 @@ func DeployOverview( return nil } -// UndeployOverview shows an undeployment overview -func UndeployOverview( - app appPkg.App, - deployedVersion, - deployedChaosVersion, - toWriteVersion string, -) error { - deployConfig := "compose.yml" - if composeFiles, ok := app.Env["COMPOSE_FILE"]; ok { - deployConfig = formatComposeFiles(composeFiles) +func getDeployType(currentVersion, newVersion string) string { + if newVersion == config.NO_DOMAIN_DEFAULT { + return "UNDEPLOY" } - - server := app.Server - if app.Server == "default" { - server = "local" + if strings.Contains(newVersion, "+U") { + return "CHAOS DEPLOY" } - - domain := app.Domain - if domain == "" { - domain = config.NO_DOMAIN_DEFAULT + if strings.Contains(currentVersion, "+U") { + return "UNCHAOS DEPLOY" } - - recipeName, exists := app.Env["RECIPE"] - if !exists { - recipeName = app.Env["TYPE"] + if currentVersion == newVersion { + return "REDEPLOY" } - - envVersion, err := recipe.GetEnvVersionRaw(recipeName) + if currentVersion == config.NO_VERSION_DEFAULT { + return "NEW DEPLOY" + } + currentParsed, err := tagcmp.Parse(currentVersion) if err != nil { - return err + return "DEPLOY" } - - if envVersion == "" { - envVersion = config.NO_VERSION_DEFAULT + newParsed, err := tagcmp.Parse(newVersion) + if err != nil { + return "DEPLOY" } - - rows := [][]string{ - {"DOMAIN", domain}, - {"RECIPE", app.Recipe.Name}, - {"SERVER", server}, - {"CONFIG", deployConfig}, - - {"CURRENT DEPLOYMENT", "---"}, - {"VERSION", formatter.BoldDirtyDefault(deployedVersion)}, - {"CHAOS", formatter.BoldDirtyDefault(deployedChaosVersion)}, - - {fmt.Sprintf("%s.ENV", strings.ToUpper(app.Name)), "---"}, - {"CURRENT VERSION", formatter.BoldDirtyDefault(envVersion)}, - {"NEW VERSION", formatter.BoldDirtyDefault(toWriteVersion)}, + if currentParsed.IsLessThan(newParsed) { + return "UPGRADE" } - - overview := formatter.CreateOverview("UNDEPLOY OVERVIEW", rows) - - fmt.Println(overview) - - if NoInput { - return nil - } - - response := false - prompt := &survey.Confirm{Message: "proceed?"} - if err := survey.AskOne(prompt, &response); err != nil { - return err - } - - if !response { - log.Fatal("undeploy cancelled") - } - - return nil + return "DOWNGRADE" } // PostCmds parses a string of commands and executes them inside of the respective services diff --git a/pkg/app/app.go b/pkg/app/app.go index 86c3a0c6..4b263deb 100644 --- a/pkg/app/app.go +++ b/pkg/app/app.go @@ -655,19 +655,6 @@ func (a App) WriteRecipeVersion(version string, dryRun bool) error { splitted := strings.Split(line, ":") - if a.Recipe.Dirty { - dirtyVersion = fmt.Sprintf("%s%s", version, config.DIRTY_DEFAULT) - if strings.Contains(line, dirtyVersion) { - skipped = true - lines = append(lines, line) - continue - } - - line = fmt.Sprintf("%s:%s", splitted[0], dirtyVersion) - lines = append(lines, line) - continue - } - line = fmt.Sprintf("%s:%s", splitted[0], version) lines = append(lines, line) } diff --git a/pkg/app/app_test.go b/pkg/app/app_test.go index 3ed6abfe..038ce294 100644 --- a/pkg/app/app_test.go +++ b/pkg/app/app_test.go @@ -223,16 +223,4 @@ func TestWriteRecipeVersionOverwrite(t *testing.T) { } assert.Equal(t, "foo", app.Recipe.EnvVersion) - - app.Recipe.Dirty = true - if err := app.WriteRecipeVersion("foo+U", false); err != nil { - t.Fatal(err) - } - - app, err = appPkg.GetApp(testPkg.ExpectedAppFiles, testPkg.AppName) - if err != nil { - t.Fatal(err) - } - - assert.Equal(t, "foo+U", app.Recipe.EnvVersion) } diff --git a/pkg/app/compose.go b/pkg/app/compose.go index 4d9573b8..1bc7b461 100644 --- a/pkg/app/compose.go +++ b/pkg/app/compose.go @@ -44,6 +44,16 @@ func SetChaosVersionLabel(compose *composetypes.Config, stackName string, chaosV } } +func SetVersionLabel(compose *composetypes.Config, stackName string, version string) { + for _, service := range compose.Services { + if service.Name == "app" { + log.Debugf("set label 'coop-cloud.%s.version' to %v for %s", stackName, version, stackName) + labelKey := fmt.Sprintf("coop-cloud.%s.version", stackName) + service.Deploy.Labels[labelKey] = version + } + } +} + // SetUpdateLabel adds env ENABLE_AUTO_UPDATE as label to enable/disable the // auto update process for this app. The default if this variable is not set is to disable // the auto update process. diff --git a/pkg/recipe/git.go b/pkg/recipe/git.go index 4b0ffd2a..9a5dd95b 100644 --- a/pkg/recipe/git.go +++ b/pkg/recipe/git.go @@ -7,6 +7,7 @@ import ( "sort" "strings" + "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/formatter" gitPkg "coopcloud.tech/abra/pkg/git" "coopcloud.tech/abra/pkg/log" @@ -45,6 +46,9 @@ func (r Recipe) Ensure(ctx EnsureContext) error { if r.EnvVersion != "" && !ctx.IgnoreEnvVersion { log.Debugf("ensuring env version %s", r.EnvVersion) + if strings.Contains(r.EnvVersion, "+U") { + log.Fatalf("can not redeploy chaos version (%s) without --chaos", r.EnvVersion) + } if _, err := r.EnsureVersion(r.EnvVersion); err != nil { return err @@ -274,19 +278,14 @@ func (r Recipe) EnsureUpToDate() error { return nil } -// IsDirty checks whether a recipe is dirty or not. N.B., if you call IsDirty -// from another Recipe method, you should propagate the pointer reference (*). -func (r *Recipe) IsDirty() error { +// IsDirty checks whether a recipe is dirty or not. +func (r *Recipe) IsDirty() (bool, error) { isClean, err := gitPkg.IsClean(r.Dir) if err != nil { - return err + return false, err } - if !isClean { - r.Dirty = true - } - - return nil + return !isClean, nil } // ChaosVersion constructs a chaos mode recipe version. @@ -300,8 +299,12 @@ func (r *Recipe) ChaosVersion() (string, error) { version = formatter.SmallSHA(head.String()) - if err := r.IsDirty(); err != nil { - return version, err + dirty, err := r.IsDirty() + if err != nil { + return "", err + } + if dirty { + return fmt.Sprintf("%s%s", version, config.DIRTY_DEFAULT), nil } return version, nil diff --git a/pkg/recipe/git_test.go b/pkg/recipe/git_test.go index 4753c0ec..32197b83 100644 --- a/pkg/recipe/git_test.go +++ b/pkg/recipe/git_test.go @@ -15,10 +15,6 @@ func TestIsDirty(t *testing.T) { t.Fatal(err) } - if err := r.IsDirty(); err != nil { - t.Fatal(err) - } - assert.False(t, r.Dirty) fpath := filepath.Join(r.Dir, "foo.txt") @@ -31,9 +27,10 @@ func TestIsDirty(t *testing.T) { os.Remove(fpath) }) - if err := r.IsDirty(); err != nil { + dirty, err := r.IsDirty() + if err != nil { t.Fatal(err) } - assert.True(t, r.Dirty) + assert.True(t, dirty) } diff --git a/pkg/recipe/recipe.go b/pkg/recipe/recipe.go index 97d92ae0..728fadca 100644 --- a/pkg/recipe/recipe.go +++ b/pkg/recipe/recipe.go @@ -12,6 +12,8 @@ import ( "strconv" "strings" + "github.com/go-git/go-git/v5" + "coopcloud.tech/abra/pkg/catalogue" "coopcloud.tech/abra/pkg/config" "coopcloud.tech/abra/pkg/formatter" @@ -20,7 +22,6 @@ import ( "coopcloud.tech/abra/pkg/log" "coopcloud.tech/abra/pkg/web" "coopcloud.tech/tagcmp" - "github.com/go-git/go-git/v5" ) // RecipeCatalogueURL is the only current recipe catalogue available. @@ -119,22 +120,9 @@ type Features struct { SSO string `json:"sso"` } -func GetEnvVersionRaw(name string) (string, error) { - var version string - - if strings.Contains(name, ":") { - split := strings.Split(name, ":") - if len(split) > 2 { - return version, fmt.Errorf("version seems invalid: %s", name) - } - version = split[1] - } - - return version, nil -} - func Get(name string) Recipe { version := "" + versionRaw := "" if strings.Contains(name, ":") { split := strings.Split(name, ":") if len(split) > 2 { @@ -143,6 +131,7 @@ func Get(name string) Recipe { name = split[0] version = split[1] + versionRaw = version if strings.HasSuffix(version, config.DIRTY_DEFAULT) { version = strings.Replace(split[1], config.DIRTY_DEFAULT, "", 1) log.Debugf("removed dirty suffix from .env version: %s -> %s", split[1], version) @@ -167,11 +156,12 @@ func Get(name string) Recipe { dir := path.Join(config.RECIPES_DIR, escapeRecipeName(name)) r := Recipe{ - Name: name, - EnvVersion: version, - Dir: dir, - GitURL: gitURL, - SSHURL: sshURL, + Name: name, + EnvVersion: version, + EnvVersionRaw: versionRaw, + Dir: dir, + GitURL: gitURL, + SSHURL: sshURL, ComposePath: path.Join(dir, "compose.yml"), ReadmePath: path.Join(dir, "README.md"), @@ -179,20 +169,23 @@ func Get(name string) Recipe { AbraShPath: path.Join(dir, "abra.sh"), } - if err := r.IsDirty(); err != nil && !errors.Is(err, git.ErrRepositoryNotExists) { + dirty, err := r.IsDirty() + if err != nil && !errors.Is(err, git.ErrRepositoryNotExists) { log.Fatalf("failed to check git status of %s: %s", r.Name, err) } + r.Dirty = dirty return r } type Recipe struct { - Name string - EnvVersion string - Dirty bool // NOTE(d1): git terminology for unstaged changes - Dir string - GitURL string - SSHURL string + Name string + EnvVersion string + EnvVersionRaw string + Dirty bool // NOTE(d1): git terminology for unstaged changes + Dir string + GitURL string + SSHURL string ComposePath string ReadmePath string diff --git a/pkg/recipe/recipe_test.go b/pkg/recipe/recipe_test.go index 8afd9df6..57a6e6ba 100644 --- a/pkg/recipe/recipe_test.go +++ b/pkg/recipe/recipe_test.go @@ -34,6 +34,7 @@ func TestGet(t *testing.T) { recipe: Recipe{ Name: "foo", EnvVersion: "1.2.3", + EnvVersionRaw: "1.2.3", Dir: path.Join(cfg.GetAbraDir(), "/recipes/foo"), GitURL: "https://git.coopcloud.tech/coop-cloud/foo.git", SSHURL: "ssh://git@git.coopcloud.tech:2222/coop-cloud/foo.git", @@ -61,6 +62,22 @@ func TestGet(t *testing.T) { recipe: Recipe{ Name: "mygit.org/myorg/cool-recipe", EnvVersion: "1.2.4", + EnvVersionRaw: "1.2.4", + Dir: path.Join(cfg.GetAbraDir(), "/recipes/mygit_org_myorg_cool-recipe"), + GitURL: "https://mygit.org/myorg/cool-recipe.git", + SSHURL: "ssh://git@mygit.org/myorg/cool-recipe.git", + ComposePath: path.Join(cfg.GetAbraDir(), "recipes/mygit_org_myorg_cool-recipe/compose.yml"), + ReadmePath: path.Join(cfg.GetAbraDir(), "recipes/mygit_org_myorg_cool-recipe/README.md"), + SampleEnvPath: path.Join(cfg.GetAbraDir(), "recipes/mygit_org_myorg_cool-recipe/.env.sample"), + AbraShPath: path.Join(cfg.GetAbraDir(), "recipes/mygit_org_myorg_cool-recipe/abra.sh"), + }, + }, + { + name: "mygit.org/myorg/cool-recipe:1e83340e+U", + recipe: Recipe{ + Name: "mygit.org/myorg/cool-recipe", + EnvVersion: "1e83340e", + EnvVersionRaw: "1e83340e+U", Dir: path.Join(cfg.GetAbraDir(), "/recipes/mygit_org_myorg_cool-recipe"), GitURL: "https://mygit.org/myorg/cool-recipe.git", SSHURL: "ssh://git@mygit.org/myorg/cool-recipe.git", @@ -105,16 +122,3 @@ func TestGetVersionLabelLocalDoesNotUseTimeoutLabel(t *testing.T) { assert.NotEqual(t, label, defaultTimeoutLabel) } } - -func TestDirtyMarkerRemoved(t *testing.T) { - r := Get("abra-test-recipe:1e83340e+U") - assert.Equal(t, "1e83340e", r.EnvVersion) -} - -func TestGetEnvVersionRaw(t *testing.T) { - v, err := GetEnvVersionRaw("abra-test-recipe:1e83340e+U") - if err != nil { - t.Fatal(err) - } - assert.Equal(t, "1e83340e+U", v) -} diff --git a/tests/integration/app_deploy.bats b/tests/integration/app_deploy.bats index 3c1aa0f9..152f247d 100644 --- a/tests/integration/app_deploy.bats +++ b/tests/integration/app_deploy.bats @@ -22,6 +22,8 @@ setup(){ teardown(){ _reset_recipe _undeploy_app + _undeploy_app2 "gitea.$TEST_SERVER" + _reset_app _reset_tags @@ -222,19 +224,6 @@ teardown(){ run $ABRA app deploy "gitea.$TEST_SERVER" --no-input --no-converge-checks assert_success assert_output --partial "$latestVersion" - - run $ABRA app undeploy "gitea.$TEST_SERVER" --no-input - assert_success - - run $ABRA app secret remove "gitea.$TEST_SERVER" --all --no-input - assert_success - - run $ABRA app volume remove "gitea.$TEST_SERVER" --no-input - assert_success - - run $ABRA app remove "gitea.$TEST_SERVER" --no-input - assert_success - assert_not_exists "$ABRA_DIR/servers/$TEST_SERVER/gitea.$TEST_SERVER.env" } # bats test_tags=slow diff --git a/tests/integration/app_deploy_overview.bats b/tests/integration/app_deploy_overview.bats index ce5b91b8..c5fa692a 100644 --- a/tests/integration/app_deploy_overview.bats +++ b/tests/integration/app_deploy_overview.bats @@ -37,17 +37,10 @@ teardown(){ --no-input --no-converge-checks assert_success - # current deployment - assert_output --regexp 'VERSION.*N/A' - assert_output --regexp 'CHAOS.*false' - - # new deployment - assert_output --regexp 'VERSION.* ' + "${latestRelease}" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*N/A' - assert_output --regexp 'NEW VERSION.*' + "${latestRelease}" + assert_output --partial 'NEW DEPLOY OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT N/A' + assert_output --partial 'ENV VERSION N/A' + assert_output --partial "NEW DEPLOYMENT ${latestRelease}" run grep -q "TYPE=$TEST_RECIPE:${latestRelease}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -61,17 +54,10 @@ teardown(){ --no-input --no-converge-checks assert_success - # current deployment - assert_output --regexp 'VERSION.*N/A' - assert_output --regexp 'CHAOS.*false' - - # new deployment - assert_output --regexp 'VERSION.* ' + "${latestRelease}" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${latestRelease}" - assert_output --regexp 'NEW VERSION.*' + "${latestRelease}" + assert_output --partial 'NEW DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT N/A" + assert_output --partial "ENV VERSION ${latestRelease}" + assert_output --partial "NEW DEPLOYMENT ${latestRelease}" run grep -q "TYPE=$TEST_RECIPE:${latestRelease}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -90,17 +76,10 @@ teardown(){ --no-input --no-converge-checks assert_success - # current deployment - assert_output --regexp 'VERSION.*N/A' - assert_output --regexp 'CHAOS.*false' - - # new deployment - assert_output --regexp 'VERSION.*' + "0.1.1+1.20.2" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "0.1.1+1.20.2" - assert_output --regexp 'NEW VERSION.*' + "0.1.1+1.20.2" + assert_output --partial 'NEW DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT N/A" + assert_output --partial "ENV VERSION 0.1.1+1.20.2" + assert_output --partial "NEW DEPLOYMENT 0.1.1+1.20.2" run grep -q "TYPE=$TEST_RECIPE:0.1.1+1.20.2" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -120,17 +99,10 @@ teardown(){ --no-input --no-converge-checks --ignore-env-version assert_success - # current deployment - assert_output --regexp 'VERSION.*N/A' - assert_output --regexp 'CHAOS.*false' - - # new deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "0.1.1+1.20.2" - assert_output --regexp 'NEW VERSION.*' + "${latestRelease}" + assert_output --partial 'NEW DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT N/A" + assert_output --partial "ENV VERSION 0.1.1+1.20.2" + assert_output --partial "NEW DEPLOYMENT ${latestRelease}" run grep -q "TYPE=$TEST_RECIPE:${latestRelease}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -153,17 +125,10 @@ teardown(){ --no-input --no-converge-checks --chaos assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*false' - - # new deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}+U" - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${latestRelease}" - assert_output --regexp 'NEW VERSION.*' + "${headHash:0:8}+U" + assert_output --partial 'CHAOS DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${latestRelease}" + assert_output --partial "ENV VERSION ${latestRelease}" + assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}+U" run rm -rf "$ABRA_DIR/recipes/$TEST_RECIPE/foo" assert_not_exists "$ABRA_DIR/recipes/$TEST_RECIPE/foo" @@ -173,7 +138,7 @@ teardown(){ assert_success } -@test "chaos deploy then force deploy" { +@test "can not redeploy chaos version without --chaos" { headHash=$(_get_head_hash) latestRelease=$(_latest_release) @@ -190,26 +155,11 @@ teardown(){ run $ABRA app deploy "$TEST_APP_DOMAIN" \ --no-input --no-converge-checks --force - assert_success - - # current deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}+U" - - # new deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${headHash:0:8}+U" - assert_output --regexp 'NEW VERSION.*' + "${latestRelease}" - - run grep -q "TYPE=$TEST_RECIPE:${latestRelease}" \ - "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" - assert_success + assert_failure + assert_output --regexp 'can not redeploy chaos version .*' + "${headHash:0:8}+U" } -@test "deploy then force chaos commit deploy" { +@test "deploy then force commit deploy" { headHash=$(_get_head_hash) latestRelease=$(_latest_release) @@ -225,17 +175,10 @@ teardown(){ --no-input --no-converge-checks --force assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*false' - - # new deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}" - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${latestRelease}" - assert_output --regexp 'NEW VERSION.*' + "${headHash:0:8}" + assert_output --partial 'DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${latestRelease}" + assert_output --partial "ENV VERSION ${latestRelease}" + assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}" run grep -q "TYPE=$TEST_RECIPE:${headHash:0:8}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -250,17 +193,10 @@ teardown(){ --no-input --no-converge-checks --chaos assert_success - # current deployment - assert_output --regexp 'VERSION.*N/A' - assert_output --regexp 'CHAOS.*false' - - # new deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}" - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${latestRelease}" - assert_output --regexp 'NEW VERSION.*' + "${headHash:0:8}" + assert_output --partial 'NEW DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT N/A" + assert_output --partial "ENV VERSION ${latestRelease}" + assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}" run bash -c 'echo "unstaged changes" >> "$ABRA_DIR/recipes/$TEST_RECIPE/foo"' assert_success @@ -270,17 +206,28 @@ teardown(){ --no-input --no-converge-checks --chaos assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}" + assert_output --partial 'CHAOS DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}" + assert_output --partial "ENV VERSION ${headHash:0:8}" + assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}+U" - # new deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}+U" + run $ABRA app deploy "$TEST_APP_DOMAIN" \ + --no-input --no-converge-checks --chaos + assert_success - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${latestRelease}" - assert_output --regexp 'NEW VERSION.*' + "${headHash:0:8}+U" + assert_output --partial 'CHAOS DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}+U" + assert_output --partial "ENV VERSION ${headHash:0:8}+U" + assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}+U" + + run $ABRA app deploy "$TEST_APP_DOMAIN" \ + --no-input --no-converge-checks --chaos + assert_success + + assert_output --partial 'CHAOS DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}+U" + assert_output --partial "ENV VERSION ${headHash:0:8}+U" + assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}+U" run grep -q "TYPE=$TEST_RECIPE:${headHash:0:8}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -302,19 +249,8 @@ teardown(){ --no-input --no-converge-checks --force assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}" - - # new deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${headHash:0:8}" - assert_output --regexp 'NEW VERSION.*' + "${latestRelease}" - - run grep -q "TYPE=$TEST_RECIPE:${latestRelease}" \ - "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" - assert_success + assert_output --partial 'CHAOS DEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}" + assert_output --partial "ENV VERSION ${headHash:0:8}" + assert_output --partial "NEW DEPLOYMENT ${headHash:0:8}" } diff --git a/tests/integration/app_rollback.bats b/tests/integration/app_rollback.bats index ac29270d..c8971b46 100644 --- a/tests/integration/app_rollback.bats +++ b/tests/integration/app_rollback.bats @@ -153,7 +153,7 @@ teardown(){ } # bats test_tags=slow -@test "rollback chaos deployment" { +@test "rollback chaos deployment is not possible" { tagHash=$(_get_tag_hash "0.2.0+1.21.0") run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$tagHash" assert_success @@ -163,17 +163,9 @@ teardown(){ assert_output --partial "${tagHash:0:8}" run $ABRA app rollback "$TEST_APP_DOMAIN" "0.1.1+1.20.2" --no-input --no-converge-checks - assert_success + assert_failure assert_output --partial "0.1.1+1.20.2" - assert_output --partial "${tagHash:0:8}" - - run $ABRA app rollback "$TEST_APP_DOMAIN" "0.1.0+1.20.0" --no-input --no-converge-checks - assert_success - assert_output --partial "0.1.0+1.20.0" - - tagHash=$(_get_tag_hash "0.1.1+1.20.2") - refute_output --partial "${tagHash:0:8}" - assert_output --partial "false" + assert_output --partial "${tagHash:0:8}" + 'is not a known version' } # bats test_tags=slow diff --git a/tests/integration/app_rollback_overview.bats b/tests/integration/app_rollback_overview.bats index 2111c9ca..240fb0e0 100644 --- a/tests/integration/app_rollback_overview.bats +++ b/tests/integration/app_rollback_overview.bats @@ -24,7 +24,7 @@ teardown(){ _reset_recipe } -@test "deploy then rollback" { +@test "deploy then rollback" { run $ABRA app deploy "$TEST_APP_DOMAIN" "0.2.0+1.21.0" \ --no-input --no-converge-checks assert_success @@ -33,23 +33,17 @@ teardown(){ --no-input --no-converge-checks assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # rollback - assert_output --regexp 'VERSION.*' + "0.1.0+1.20.0" - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'NEW VERSION.*' + "0.1.0+1.20.0" + assert_output --partial 'DOWNGRADE OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT 0.2.0+1.21.0' + assert_output --partial 'ENV VERSION 0.2.0+1.21.0' + assert_output --partial 'NEW DEPLOYMENT 0.1.0+1.20.0' run grep -q "TYPE=$TEST_RECIPE:0.1.0+1.20.0" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" assert_success } -@test "force rollback" { +@test "force rollback" { run $ABRA app deploy "$TEST_APP_DOMAIN" "0.2.0+1.21.0" \ --no-input --no-converge-checks assert_success @@ -58,16 +52,10 @@ teardown(){ --no-input --no-converge-checks --force assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # rollback - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'NEW VERSION.*' + "0.2.0+1.21.0" + assert_output --partial 'REDEPLOY OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT 0.2.0+1.21.0' + assert_output --partial 'ENV VERSION 0.2.0+1.21.0' + assert_output --partial 'NEW DEPLOYMENT 0.2.0+1.21.0' run grep -q "TYPE=$TEST_RECIPE:0.2.0+1.21.0" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -85,16 +73,10 @@ teardown(){ --no-input --no-converge-checks assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # rollback - assert_output --regexp 'VERSION.*' + "0.1.0+1.20.0" - - # env version - assert_output --regexp 'CURRENT VERSION.*N/A' - assert_output --regexp 'NEW VERSION.*' + "0.2.0+1.21.0" + assert_output --partial 'DOWNGRADE OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT 0.2.0+1.21.0' + assert_output --partial 'ENV VERSION N/A' + assert_output --partial 'NEW DEPLOYMENT 0.1.0+1.20.0' run grep -q "TYPE=$TEST_RECIPE:${latestRelease}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" diff --git a/tests/integration/app_undeploy.bats b/tests/integration/app_undeploy.bats index eba63388..f44fd287 100644 --- a/tests/integration/app_undeploy.bats +++ b/tests/integration/app_undeploy.bats @@ -92,9 +92,6 @@ teardown(){ run $ABRA app undeploy "$TEST_APP_DOMAIN" --no-input assert_success - - # NOTE(d1): ensure not chaos undeploy - assert_output --partial 'false' } # bats test_tags=slow diff --git a/tests/integration/app_undeploy_overview.bats b/tests/integration/app_undeploy_overview.bats index 847def0e..e4bbdaf2 100644 --- a/tests/integration/app_undeploy_overview.bats +++ b/tests/integration/app_undeploy_overview.bats @@ -33,13 +33,10 @@ teardown(){ run $ABRA app undeploy "$TEST_APP_DOMAIN" --no-input assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "0.1.0+1.20.0" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "0.1.0+1.20.0" - assert_output --regexp 'NEW VERSION.*' + "0.1.0+1.20.0" + assert_output --partial 'UNDEPLOY OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT 0.1.0+1.20.0' + assert_output --partial 'ENV VERSION 0.1.0+1.20.0' + assert_output --partial 'NEW DEPLOYMENT N/A' run grep -q "TYPE=$TEST_RECIPE:0.1.0+1.20.0" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -57,13 +54,10 @@ teardown(){ run $ABRA app undeploy "$TEST_APP_DOMAIN" --no-input assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}" - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${latestRelease}" - assert_output --regexp 'NEW VERSION.*' + "${headHash:0:8}" + assert_output --partial 'UNDEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}" + assert_output --partial "ENV VERSION ${headHash:0:8}" + assert_output --partial 'NEW DEPLOYMENT N/A' run grep -q "TYPE=$TEST_RECIPE:${headHash:0:8}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -72,7 +66,6 @@ teardown(){ @test "chaos deploy with unstaged commits and undeploy" { headHash=$(_get_head_hash) - latestRelease=$(_latest_release) run bash -c 'echo "unstaged changes" >> "$ABRA_DIR/recipes/$TEST_RECIPE/foo"' assert_success @@ -85,13 +78,10 @@ teardown(){ run $ABRA app undeploy "$TEST_APP_DOMAIN" --no-input assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "${latestRelease}" - assert_output --regexp 'CHAOS.*' + "${headHash:0:8}+U" - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "${latestRelease}" - assert_output --regexp 'NEW VERSION.*' + "${headHash:0:8}+U" + assert_output --partial 'UNDEPLOY OVERVIEW' + assert_output --partial "CURRENT DEPLOYMENT ${headHash:0:8}+U" + assert_output --partial "ENV VERSION ${headHash:0:8}+U" + assert_output --partial 'NEW DEPLOYMENT N/A' run grep -q "TYPE=$TEST_RECIPE:${headHash:0:8}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" diff --git a/tests/integration/app_upgrade.bats b/tests/integration/app_upgrade.bats index 100f33ad..badf74bd 100644 --- a/tests/integration/app_upgrade.bats +++ b/tests/integration/app_upgrade.bats @@ -205,7 +205,7 @@ teardown(){ } # bats test_tags=slow -@test "upgrade chaos deployment" { +@test "upgrade commit deployment not possible" { tagHash=$(_get_tag_hash "0.1.0+1.20.0") run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" checkout "$tagHash" assert_success @@ -215,17 +215,8 @@ teardown(){ assert_output --partial "${tagHash:0:8}" run $ABRA app upgrade "$TEST_APP_DOMAIN" "0.1.1+1.20.2" --no-input --no-converge-checks - assert_success - assert_output --partial "0.1.1+1.20.2" - assert_output --partial "${tagHash:0:8}" - - run $ABRA app upgrade "$TEST_APP_DOMAIN" "0.2.0+1.21.0" --no-input --no-converge-checks - assert_success - assert_output --partial "0.2.0+1.21.0" - - tagHash=$(_get_tag_hash "0.1.1+1.20.2") - refute_output --partial "${tagHash:0:8}" - assert_output --partial "false" + assert_failure + assert_output --partial "not a known version" } @test "chaos commit upgrade not possible" { diff --git a/tests/integration/app_upgrade_overview.bats b/tests/integration/app_upgrade_overview.bats index 4b906b90..978e5fc2 100644 --- a/tests/integration/app_upgrade_overview.bats +++ b/tests/integration/app_upgrade_overview.bats @@ -31,24 +31,17 @@ teardown(){ --no-input --no-converge-checks assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "0.1.0+1.20.0" - assert_output --regexp 'CHAOS.*false' - - # upgrade - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "0.1.0+1.20.0" - assert_output --regexp 'NEW VERSION.*' + "0.2.0+1.21.0" + assert_output --partial 'UPGRADE OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT 0.1.0+1.20.0' + assert_output --partial 'ENV VERSION 0.1.0+1.20.0' + assert_output --partial 'NEW DEPLOYMENT 0.2.0+1.21.0' run grep -q "TYPE=$TEST_RECIPE:0.2.0+1.21.0" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" assert_success } -@test "force upgrade" { +@test "force upgrade" { run $ABRA app deploy "$TEST_APP_DOMAIN" "0.2.0+1.21.0" \ --no-input --no-converge-checks assert_success @@ -57,17 +50,10 @@ teardown(){ --no-input --no-converge-checks --force assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # upgrade - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'NEW VERSION.*' + "0.2.0+1.21.0" + assert_output --partial 'REDEPLOY OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT 0.2.0+1.21.0' + assert_output --partial 'ENV VERSION 0.2.0+1.21.0' + assert_output --partial 'NEW DEPLOYMENT 0.2.0+1.21.0' run grep -q "TYPE=$TEST_RECIPE:0.2.0+1.21.0" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" @@ -87,17 +73,10 @@ teardown(){ --no-input --no-converge-checks --force assert_success - # current deployment - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # upgrade - assert_output --regexp 'VERSION.*' + "0.2.0+1.21.0" - assert_output --regexp 'CHAOS.*false' - - # env version - assert_output --regexp 'CURRENT VERSION.*N/A' - assert_output --regexp 'NEW VERSION.*' + "0.2.0+1.21.0" + assert_output --partial 'UPGRADE OVERVIEW' + assert_output --partial 'CURRENT DEPLOYMENT 0.2.0+1.21.0' + assert_output --partial 'ENV VERSION N/A' + assert_output --partial 'NEW DEPLOYMENT 0.3.1+1.21.0' run grep -q "TYPE=$TEST_RECIPE:${latestRelease}" \ "$ABRA_DIR/servers/$TEST_SERVER/$TEST_APP_DOMAIN.env" diff --git a/tests/integration/helpers/app.bash b/tests/integration/helpers/app.bash index 89958586..c9da3294 100644 --- a/tests/integration/helpers/app.bash +++ b/tests/integration/helpers/app.bash @@ -30,6 +30,15 @@ _undeploy_app() { assert_output --partial 'unknown' } +_undeploy_app2() { + run $ABRA app undeploy "$1" --no-input + + run $ABRA app ls --server "$TEST_SERVER" --status + assert_success + assert_output --partial "$1" + assert_output --partial 'unknown' +} + _rm_app() { # NOTE(d1): not asserting outcomes on teardown here since some might fail # depending on what the test created. all commands run through anyway diff --git a/tests/integration/helpers/git.bash b/tests/integration/helpers/git.bash index 637136f8..e88128dd 100644 --- a/tests/integration/helpers/git.bash +++ b/tests/integration/helpers/git.bash @@ -38,6 +38,8 @@ _set_git_author() { } _git_commit() { + _set_git_author + run git -C "$ABRA_DIR/recipes/$TEST_RECIPE" add . assert_success