diff --git a/cli/app/deploy.go b/cli/app/deploy.go index 9d4bf46c..dfca53bf 100644 --- a/cli/app/deploy.go +++ b/cli/app/deploy.go @@ -119,6 +119,19 @@ recipes. logrus.Fatal(err) } + if len(versions) == 0 { + logrus.Warn("no published versions in catalogue, trying local recipe repository") + recipeVersions, err := recipe.GetRecipeVersions(app.Recipe, internal.Offline) + if err != nil { + logrus.Warn(err) + } + for _, recipeVersion := range recipeVersions { + for version := range recipeVersion { + versions = append(versions, version) + } + } + } + if len(versions) > 0 { version = versions[len(versions)-1] logrus.Debugf("choosing %s as version to deploy", version) diff --git a/cli/app/rollback.go b/cli/app/rollback.go index afb70b9e..1f644e9e 100644 --- a/cli/app/rollback.go +++ b/cli/app/rollback.go @@ -22,7 +22,7 @@ var appRollbackCommand = cli.Command{ Name: "rollback", Aliases: []string{"rl"}, Usage: "Roll an app back to a previous version", - ArgsUsage: "", + ArgsUsage: " []", Flags: []cli.Flag{ internal.DebugFlag, internal.NoInputFlag, @@ -106,17 +106,42 @@ recipes. logrus.Fatal(err) } - if len(versions) == 0 && !internal.Chaos { - logrus.Fatalf("no published releases for %s in the recipe catalogue?", app.Recipe) + if len(versions) == 0 { + logrus.Warn("no published versions in catalogue, trying local recipe repository") + recipeVersions, err := recipe.GetRecipeVersions(app.Recipe, internal.Offline) + if err != nil { + logrus.Warn(err) + } + for _, recipeVersion := range recipeVersions { + for version := range recipeVersion { + versions = append(versions, version) + } + } } var availableDowngrades []string if deployedVersion == "unknown" { availableDowngrades = versions - logrus.Warnf("failed to determine version of deployed %s", app.Name) + logrus.Warnf("failed to determine deployed version of %s", app.Name) } - if deployedVersion != "unknown" && !internal.Chaos { + specificVersion := c.Args().Get(1) + if specificVersion != "" { + parsedDeployedVersion, err := tagcmp.Parse(deployedVersion) + if err != nil { + logrus.Fatal(err) + } + parsedSpecificVersion, err := tagcmp.Parse(specificVersion) + if err != nil { + logrus.Fatal(err) + } + if parsedSpecificVersion.IsGreaterThan(parsedDeployedVersion) || parsedSpecificVersion.Equals(parsedDeployedVersion) { + logrus.Fatalf("%s is not a downgrade for %s?", deployedVersion, specificVersion) + } + availableDowngrades = append(availableDowngrades, specificVersion) + } + + if deployedVersion != "unknown" && !internal.Chaos && specificVersion == "" { for _, version := range versions { parsedDeployedVersion, err := tagcmp.Parse(deployedVersion) if err != nil { @@ -126,12 +151,12 @@ recipes. if err != nil { logrus.Fatal(err) } - if parsedVersion != parsedDeployedVersion && parsedVersion.IsLessThan(parsedDeployedVersion) { + if parsedVersion.IsLessThan(parsedDeployedVersion) && !(parsedVersion.Equals(parsedDeployedVersion)) { availableDowngrades = append(availableDowngrades, version) } } - if len(availableDowngrades) == 0 { + if len(availableDowngrades) == 0 && !internal.Force { logrus.Info("no available downgrades, you're on oldest ✌️") return nil } @@ -139,7 +164,7 @@ recipes. var chosenDowngrade string if len(availableDowngrades) > 0 && !internal.Chaos { - if internal.Force || internal.NoInput { + if internal.Force || internal.NoInput || specificVersion != "" { chosenDowngrade = availableDowngrades[len(availableDowngrades)-1] logrus.Debugf("choosing %s as version to downgrade to (--force/--no-input)", chosenDowngrade) } else { diff --git a/cli/app/upgrade.go b/cli/app/upgrade.go index 7bb85fbf..619298d6 100644 --- a/cli/app/upgrade.go +++ b/cli/app/upgrade.go @@ -22,7 +22,7 @@ var appUpgradeCommand = cli.Command{ Name: "upgrade", Aliases: []string{"up"}, Usage: "Upgrade an app", - ArgsUsage: "", + ArgsUsage: " []", Flags: []cli.Flag{ internal.DebugFlag, internal.NoInputFlag, @@ -107,17 +107,42 @@ recipes. logrus.Fatal(err) } - if len(versions) == 0 && !internal.Chaos { - logrus.Fatalf("no published releases for %s in the recipe catalogue?", app.Recipe) + if len(versions) == 0 { + logrus.Warn("no published versions in catalogue, trying local recipe repository") + recipeVersions, err := recipePkg.GetRecipeVersions(app.Recipe, internal.Offline) + if err != nil { + logrus.Warn(err) + } + for _, recipeVersion := range recipeVersions { + for version := range recipeVersion { + versions = append(versions, version) + } + } } var availableUpgrades []string if deployedVersion == "unknown" { availableUpgrades = versions - logrus.Warnf("failed to determine version of deployed %s", app.Name) + logrus.Warnf("failed to determine deployed version of %s", app.Name) } - if deployedVersion != "unknown" && !internal.Chaos { + specificVersion := c.Args().Get(1) + if specificVersion != "" { + parsedDeployedVersion, err := tagcmp.Parse(deployedVersion) + if err != nil { + logrus.Fatal(err) + } + parsedSpecificVersion, err := tagcmp.Parse(specificVersion) + if err != nil { + logrus.Fatal(err) + } + if parsedSpecificVersion.IsLessThan(parsedDeployedVersion) || parsedSpecificVersion.Equals(parsedDeployedVersion) { + logrus.Fatalf("%s is not an upgrade for %s?", deployedVersion, specificVersion) + } + availableUpgrades = append(availableUpgrades, specificVersion) + } + + if deployedVersion != "unknown" && !internal.Chaos && specificVersion == "" { for _, version := range versions { parsedDeployedVersion, err := tagcmp.Parse(deployedVersion) if err != nil { @@ -127,7 +152,7 @@ recipes. if err != nil { logrus.Fatal(err) } - if parsedVersion.IsGreaterThan(parsedDeployedVersion) { + if parsedVersion.IsGreaterThan(parsedDeployedVersion) && !(parsedVersion.Equals(parsedDeployedVersion)) { availableUpgrades = append(availableUpgrades, version) } } @@ -140,7 +165,7 @@ recipes. var chosenUpgrade string if len(availableUpgrades) > 0 && !internal.Chaos { - if internal.Force || internal.NoInput { + if internal.Force || internal.NoInput || specificVersion != "" { chosenUpgrade = availableUpgrades[len(availableUpgrades)-1] logrus.Debugf("choosing %s as version to upgrade to", chosenUpgrade) } else {