diff --git a/cli/app/rollback.go b/cli/app/rollback.go index d5ea800d..5130a02f 100644 --- a/cli/app/rollback.go +++ b/cli/app/rollback.go @@ -45,6 +45,15 @@ recipes. app := internal.ValidateApp(c) stackName := app.StackName() + r, err := recipe.Get(app.Type) + if err != nil { + logrus.Fatal(err) + } + + if err := recipe.LintForErrors(r); err != nil { + logrus.Fatal(err) + } + cl, err := client.New(app.Server) if err != nil { logrus.Fatal(err) diff --git a/cli/app/upgrade.go b/cli/app/upgrade.go index 7db4b1a1..e8250cd6 100644 --- a/cli/app/upgrade.go +++ b/cli/app/upgrade.go @@ -49,6 +49,15 @@ recipes. app := internal.ValidateApp(c) stackName := app.StackName() + r, err := recipe.Get(app.Type) + if err != nil { + logrus.Fatal(err) + } + + if err := recipe.LintForErrors(r); err != nil { + logrus.Fatal(err) + } + cl, err := client.New(app.Server) if err != nil { logrus.Fatal(err) diff --git a/cli/internal/deploy.go b/cli/internal/deploy.go index a01e50da..9e19a05f 100644 --- a/cli/internal/deploy.go +++ b/cli/internal/deploy.go @@ -22,6 +22,15 @@ func DeployAction(c *cli.Context) error { app := ValidateApp(c) stackName := app.StackName() + r, err := recipe.Get(app.Type) + if err != nil { + logrus.Fatal(err) + } + + if err := recipe.LintForErrors(r); err != nil { + logrus.Fatal(err) + } + cl, err := client.New(app.Server) if err != nil { logrus.Fatal(err) diff --git a/pkg/recipe/lint.go b/pkg/recipe/lint.go index f6cf8593..c6d307d1 100644 --- a/pkg/recipe/lint.go +++ b/pkg/recipe/lint.go @@ -9,6 +9,7 @@ import ( "coopcloud.tech/abra/pkg/config" "coopcloud.tech/tagcmp" "github.com/docker/distribution/reference" + "github.com/sirupsen/logrus" ) var Warn = "warn" @@ -122,6 +123,29 @@ var LintRules = map[string][]LintRule{ }, } +func LintForErrors(recipe Recipe) error { + logrus.Debugf("linting for critical errors in %s configs", recipe.Name) + + for level := range LintRules { + if level != "error" { + continue + } + for _, rule := range LintRules[level] { + ok, err := rule.Function(recipe) + if err != nil { + return err + } + if !ok { + return fmt.Errorf("lint error in %s configs: \"%s\" failed lint checks (%s)", recipe.Name, rule.Description, rule.Ref) + } + } + } + + logrus.Debugf("linting successful, %s is well configured", recipe.Name) + + return nil +} + func LintComposeVersion(recipe Recipe) (bool, error) { if recipe.Config.Version == "3.8" { return true, nil