From 2f7e95cc462f6b6bfc74651e80b967cedd6a184a Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 21 May 2015 15:29:45 -0600 Subject: [PATCH] template: Validate --- template/template.go | 35 ++++++++++++++++ template/template_test.go | 42 +++++++++++++++++++ .../test-fixtures/validate-bad-override.json | 12 ++++++ .../test-fixtures/validate-good-override.json | 12 ++++++ .../test-fixtures/validate-no-builders.json | 1 + 5 files changed, 102 insertions(+) create mode 100644 template/test-fixtures/validate-bad-override.json create mode 100644 template/test-fixtures/validate-good-override.json create mode 100644 template/test-fixtures/validate-no-builders.json diff --git a/template/template.go b/template/template.go index 8de30b1a9..0ea2a4eb7 100644 --- a/template/template.go +++ b/template/template.go @@ -1,8 +1,11 @@ package template import ( + "errors" "fmt" "time" + + "github.com/hashicorp/go-multierror" ) // Template represents the parsed template that is used to configure @@ -68,6 +71,38 @@ type OnlyExcept struct { Except []string } +//------------------------------------------------------------------- +// Functions +//------------------------------------------------------------------- + +// Validate does some basic validation of the template on top of the +// validation that occurs while parsing. If possible, we try to defer +// validation to here. The validation errors that occur during parsing +// are the minimal necessary to make sure parsing builds a reasonable +// Template structure. +func (t *Template) Validate() error { + var err error + + // At least one builder must be defined + if len(t.Builders) == 0 { + err = multierror.Append(err, errors.New( + "at least one builder must be defined")) + } + + // Verify that the provisioner overrides target builders that exist + for i, p := range t.Provisioners { + for name, _ := range p.Override { + if _, ok := t.Builders[name]; !ok { + err = multierror.Append(err, fmt.Errorf( + "provisioner %d: override '%s' doesn't exist", + i+1, name)) + } + } + } + + return err +} + //------------------------------------------------------------------- // GoStringer //------------------------------------------------------------------- diff --git a/template/template_test.go b/template/template_test.go index 2847bf9a2..e8a0ff2fe 100644 --- a/template/template_test.go +++ b/template/template_test.go @@ -1,7 +1,9 @@ package template import ( + "os" "path/filepath" + "testing" ) const FixturesDir = "./test-fixtures" @@ -10,3 +12,43 @@ const FixturesDir = "./test-fixtures" func fixtureDir(n string) string { return filepath.Join(FixturesDir, n) } + +func TestTemplateValidate(t *testing.T) { + cases := []struct { + File string + Err bool + }{ + { + "validate-no-builders.json", + true, + }, + + { + "validate-bad-override.json", + true, + }, + + { + "validate-good-override.json", + false, + }, + } + + for _, tc := range cases { + f, err := os.Open(fixtureDir(tc.File)) + if err != nil { + t.Fatalf("err: %s", err) + } + + tpl, err := Parse(f) + f.Close() + if err != nil { + t.Fatalf("err: %s\n\n%s", tc.File, err) + } + + err = tpl.Validate() + if (err != nil) != tc.Err { + t.Fatalf("err: %s\n\n%s", tc.File, err) + } + } +} diff --git a/template/test-fixtures/validate-bad-override.json b/template/test-fixtures/validate-bad-override.json new file mode 100644 index 000000000..7f6c64588 --- /dev/null +++ b/template/test-fixtures/validate-bad-override.json @@ -0,0 +1,12 @@ +{ + "builders": [{ + "type": "foo" + }], + + "provisioners": [{ + "type": "bar", + "override": { + "bar": {} + } + }] +} diff --git a/template/test-fixtures/validate-good-override.json b/template/test-fixtures/validate-good-override.json new file mode 100644 index 000000000..4d7e0f757 --- /dev/null +++ b/template/test-fixtures/validate-good-override.json @@ -0,0 +1,12 @@ +{ + "builders": [{ + "type": "foo" + }], + + "provisioners": [{ + "type": "bar", + "override": { + "foo": {} + } + }] +} diff --git a/template/test-fixtures/validate-no-builders.json b/template/test-fixtures/validate-no-builders.json new file mode 100644 index 000000000..0967ef424 --- /dev/null +++ b/template/test-fixtures/validate-no-builders.json @@ -0,0 +1 @@ +{}