package recipe import ( "fmt" "coopcloud.tech/abra/cli/internal" "coopcloud.tech/abra/pkg/autocomplete" "coopcloud.tech/abra/pkg/formatter" "coopcloud.tech/abra/pkg/lint" recipePkg "coopcloud.tech/abra/pkg/recipe" "github.com/sirupsen/logrus" "github.com/urfave/cli" ) var recipeLintCommand = cli.Command{ Name: "lint", Usage: "Lint a recipe", Aliases: []string{"l"}, ArgsUsage: "", Flags: []cli.Flag{ internal.DebugFlag, internal.NoInputFlag, internal.OnlyErrorFlag, }, Before: internal.SubCommandBefore, BashComplete: autocomplete.RecipeNameComplete, Action: func(c *cli.Context) error { recipe := internal.ValidateRecipe(c) if err := recipePkg.EnsureUpToDate(recipe.Name); err != nil { logrus.Fatal(err) } tableCol := []string{"ref", "rule", "satisfied", "severity", "resolve"} table := formatter.CreateTable(tableCol) hasError := false bar := formatter.CreateProgressbar(-1, "running recipe lint rules...") for level := range lint.LintRules { for _, rule := range lint.LintRules[level] { ok, err := rule.Function(recipe) if err != nil { logrus.Warn(err) } if !ok && rule.Level == "error" { hasError = true } var result string if ok { result = "yes" } else { result = "NO" } if internal.OnlyErrors { if !ok && rule.Level == "error" { table.Append([]string{rule.Ref, rule.Description, result, rule.Level, rule.HowToResolve}) bar.Add(1) } } else { table.Append([]string{rule.Ref, rule.Description, result, rule.Level, rule.HowToResolve}) bar.Add(1) } } } if table.NumLines() > 0 { fmt.Println() table.Render() } if hasError { logrus.Warn("watch out, some critical errors are present in your recipe config") } return nil }, }