diff --git a/cli/internal/validate.go b/cli/internal/validate.go index af8b8d80..b95d1da9 100644 --- a/cli/internal/validate.go +++ b/cli/internal/validate.go @@ -48,14 +48,33 @@ func ValidateRecipeWithPrompt(c *cli.Context) recipe.Recipe { recipeName := c.Args().First() if recipeName == "" && !NoInput { + var recipes []string + catl, err := catalogue.ReadRecipeCatalogue() if err != nil { logrus.Fatal(err) } - var recipes []string + + knownRecipes := make(map[string]bool) for name := range catl { - recipes = append(recipes, name) + knownRecipes[name] = true } + + localRecipes, err := recipe.GetRecipesLocal() + if err != nil { + logrus.Fatal(err) + } + + for _, recipeLocal := range localRecipes { + if _, ok := knownRecipes[recipeLocal]; !ok { + knownRecipes[recipeLocal] = true + } + } + + for recipeName := range knownRecipes { + recipes = append(recipes, recipeName) + } + prompt := &survey.Select{ Message: "Select recipe", Options: recipes, diff --git a/cli/recipe/upgrade.go b/cli/recipe/upgrade.go index 1602343b..a9ef0dc0 100644 --- a/cli/recipe/upgrade.go +++ b/cli/recipe/upgrade.go @@ -97,11 +97,6 @@ You may invoke this command in "wizard" mode and be prompted for input: } for _, service := range recipe.Config.Services { - catlVersions, err := catalogue.VersionsOfService(recipe.Name, service.Name) - if err != nil { - logrus.Fatal(err) - } - img, err := reference.ParseNormalizedNamed(service.Image) if err != nil { logrus.Fatal(err) @@ -152,6 +147,11 @@ You may invoke this command in "wizard" mode and be prompted for input: continue // skip on to the next tag and don't update any compose files } + catlVersions, err := catalogue.VersionsOfService(recipe.Name, service.Name) + if err != nil { + logrus.Fatal(err) + } + var compatibleStrings []string for _, compat := range compatible { skip := false diff --git a/pkg/catalogue/catalogue.go b/pkg/catalogue/catalogue.go index 3f3fb3f8..bcf99aca 100644 --- a/pkg/catalogue/catalogue.go +++ b/pkg/catalogue/catalogue.go @@ -220,6 +220,8 @@ func readRecipeCatalogueWeb(target interface{}) error { // VersionsOfService lists the version of a service. func VersionsOfService(recipe, serviceName string) ([]string, error) { + var versions []string + catalogue, err := ReadRecipeCatalogue() if err != nil { return nil, err @@ -227,10 +229,9 @@ func VersionsOfService(recipe, serviceName string) ([]string, error) { rec, ok := catalogue[recipe] if !ok { - return nil, fmt.Errorf("recipe '%s' does not exist?", recipe) + return versions, nil } - versions := []string{} alreadySeen := make(map[string]bool) for _, serviceVersion := range rec.Versions { for tag := range serviceVersion { diff --git a/pkg/config/app.go b/pkg/config/app.go index 25d3711d..9c9b1f58 100644 --- a/pkg/config/app.go +++ b/pkg/config/app.go @@ -135,7 +135,7 @@ func LoadAppFiles(servers ...string) (AppFiles, error) { if servers[0] == "" { // Empty servers flag, one string will always be passed var err error - servers, err = getAllFoldersInDirectory(ABRA_SERVER_FOLDER) + servers, err = GetAllFoldersInDirectory(ABRA_SERVER_FOLDER) if err != nil { return nil, err } diff --git a/pkg/config/env.go b/pkg/config/env.go index 7c4ba3e5..d3f66d56 100644 --- a/pkg/config/env.go +++ b/pkg/config/env.go @@ -95,8 +95,8 @@ func getAllFilesInDirectory(directory string) ([]fs.FileInfo, error) { return realFiles, nil } -// getAllFoldersInDirectory returns both folder and symlink paths -func getAllFoldersInDirectory(directory string) ([]string, error) { +// GetAllFoldersInDirectory returns both folder and symlink paths +func GetAllFoldersInDirectory(directory string) ([]string, error) { var folders []string files, err := ioutil.ReadDir(directory) diff --git a/pkg/recipe/recipe.go b/pkg/recipe/recipe.go index 6831abff..e0769b5f 100644 --- a/pkg/recipe/recipe.go +++ b/pkg/recipe/recipe.go @@ -259,3 +259,15 @@ func ChaosVersion(recipeName string) (string, error) { return version, nil } + +// GetRecipesLocal retrieves all local recipe directories +func GetRecipesLocal() ([]string, error) { + var recipes []string + + recipes, err := config.GetAllFoldersInDirectory(config.APPS_DIR) + if err != nil { + return recipes, err + } + + return recipes, nil +}