From 62cc7ef92d028c323e3779e8f2c14fe92f7fea12 Mon Sep 17 00:00:00 2001 From: decentral1se Date: Mon, 18 Oct 2021 08:57:25 +0200 Subject: [PATCH] feat: upgrade/downgrade support chaos mode --- cli/app/deploy.go | 15 ++------------- cli/app/rollback.go | 38 +++++++++++++++++++++++++------------- cli/app/upgrade.go | 38 +++++++++++++++++++++++++------------- pkg/recipe/recipe.go | 23 +++++++++++++++++++++++ 4 files changed, 75 insertions(+), 39 deletions(-) diff --git a/cli/app/deploy.go b/cli/app/deploy.go index 54029220..765e3a6e 100644 --- a/cli/app/deploy.go +++ b/cli/app/deploy.go @@ -10,7 +10,6 @@ import ( "coopcloud.tech/abra/pkg/client" stack "coopcloud.tech/abra/pkg/client/stack" "coopcloud.tech/abra/pkg/config" - "coopcloud.tech/abra/pkg/git" "coopcloud.tech/abra/pkg/recipe" "github.com/AlecAivazis/survey/v2" "github.com/sirupsen/logrus" @@ -86,21 +85,11 @@ recipes. if internal.Chaos { logrus.Warnf("chaos mode engaged") - head, err := git.GetRecipeHead(app.Type) + var err error + version, err = recipe.ChaosVersion(app.Type) if err != nil { logrus.Fatal(err) } - - version = head.String()[:8] - - isClean, err := git.IsClean(app.Type) - if err != nil { - logrus.Fatal(err) - } - - if !isClean { - version = fmt.Sprintf("%s + unstaged changes", version) - } } abraShPath := fmt.Sprintf("%s/%s/%s", config.APPS_DIR, app.Type, "abra.sh") diff --git a/cli/app/rollback.go b/cli/app/rollback.go index df83200a..43c2a477 100644 --- a/cli/app/rollback.go +++ b/cli/app/rollback.go @@ -23,6 +23,7 @@ var appRollbackCommand = &cli.Command{ ArgsUsage: "", Flags: []cli.Flag{ internal.ForceFlag, + internal.ChaosFlag, }, Description: ` This command rolls an app back to a previous version if one exists. @@ -81,7 +82,7 @@ recipes. logrus.Warnf("failed to determine version of deployed '%s'", app.Name) } - if deployedVersion != "unknown" { + if deployedVersion != "unknown" && !internal.Chaos { for _, version := range versions { parsedDeployedVersion, err := tagcmp.Parse(deployedVersion) if err != nil { @@ -107,23 +108,34 @@ recipes. } var chosenDowngrade string - if !internal.Force { - prompt := &survey.Select{ - Message: fmt.Sprintf("Please select a downgrade (current version: '%s'):", deployedVersion), - Options: availableDowngrades, - } - if err := survey.AskOne(prompt, &chosenDowngrade); err != nil { - return err + if !internal.Chaos { + if internal.Force { + chosenDowngrade = availableDowngrades[0] + logrus.Debugf("choosing '%s' as version to downgrade to (--force)", chosenDowngrade) + } else { + prompt := &survey.Select{ + Message: fmt.Sprintf("Please select a downgrade (current version: '%s'):", deployedVersion), + Options: availableDowngrades, + } + if err := survey.AskOne(prompt, &chosenDowngrade); err != nil { + return err + } } } - if internal.Force { - chosenDowngrade = availableDowngrades[0] - logrus.Debugf("choosing '%s' as version to downgrade to", chosenDowngrade) + if !internal.Chaos { + if err := recipe.EnsureVersion(app.Type, chosenDowngrade); err != nil { + logrus.Fatal(err) + } } - if err := recipe.EnsureVersion(app.Type, chosenDowngrade); err != nil { - logrus.Fatal(err) + if internal.Chaos { + logrus.Warn("chaos mode engaged") + var err error + chosenDowngrade, err = recipe.ChaosVersion(app.Type) + if err != nil { + logrus.Fatal(err) + } } abraShPath := fmt.Sprintf("%s/%s/%s", config.APPS_DIR, app.Type, "abra.sh") diff --git a/cli/app/upgrade.go b/cli/app/upgrade.go index b0e5eb0c..d29c8c9f 100644 --- a/cli/app/upgrade.go +++ b/cli/app/upgrade.go @@ -22,6 +22,7 @@ var appUpgradeCommand = &cli.Command{ ArgsUsage: "", Flags: []cli.Flag{ internal.ForceFlag, + internal.ChaosFlag, }, Description: ` This command supports upgrading an app. You can use it to choose and roll out a @@ -77,7 +78,7 @@ recipes. logrus.Warnf("failed to determine version of deployed '%s'", app.Name) } - if deployedVersion != "unknown" { + if deployedVersion != "unknown" && !internal.Chaos { for _, version := range versions { parsedDeployedVersion, err := tagcmp.Parse(deployedVersion) if err != nil { @@ -98,23 +99,34 @@ recipes. } var chosenUpgrade string - if !internal.Force { - prompt := &survey.Select{ - Message: fmt.Sprintf("Please select an upgrade (current version: '%s'):", deployedVersion), - Options: availableUpgrades, - } - if err := survey.AskOne(prompt, &chosenUpgrade); err != nil { - return err + if !internal.Chaos { + if internal.Force { + chosenUpgrade = availableUpgrades[len(availableUpgrades)-1] + logrus.Debugf("choosing '%s' as version to upgrade to", chosenUpgrade) + } else { + prompt := &survey.Select{ + Message: fmt.Sprintf("Please select an upgrade (current version: '%s'):", deployedVersion), + Options: availableUpgrades, + } + if err := survey.AskOne(prompt, &chosenUpgrade); err != nil { + return err + } } } - if internal.Force { - chosenUpgrade = availableUpgrades[len(availableUpgrades)-1] - logrus.Debugf("choosing '%s' as version to upgrade to", chosenUpgrade) + if !internal.Chaos { + if err := recipe.EnsureVersion(app.Type, chosenUpgrade); err != nil { + logrus.Fatal(err) + } } - if err := recipe.EnsureVersion(app.Type, chosenUpgrade); err != nil { - logrus.Fatal(err) + if internal.Chaos { + logrus.Warn("chaos mode engaged") + var err error + chosenUpgrade, err = recipe.ChaosVersion(app.Type) + if err != nil { + logrus.Fatal(err) + } } abraShPath := fmt.Sprintf("%s/%s/%s", config.APPS_DIR, app.Type, "abra.sh") diff --git a/pkg/recipe/recipe.go b/pkg/recipe/recipe.go index c84d863d..975dba13 100644 --- a/pkg/recipe/recipe.go +++ b/pkg/recipe/recipe.go @@ -195,3 +195,26 @@ func EnsureLatest(recipeName string) error { return nil } + +// ChaosVersion constructs a chaos mode recipe version. +func ChaosVersion(recipeName string) (string, error) { + var version string + + head, err := gitPkg.GetRecipeHead(recipeName) + if err != nil { + return version, err + } + + version = head.String()[:8] + + isClean, err := gitPkg.IsClean(recipeName) + if err != nil { + return version, err + } + + if !isClean { + version = fmt.Sprintf("%s + unstaged changes", version) + } + + return version, nil +}