From da683afde0224d72bc5aa7170ca0a4c381f441a8 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Sat, 9 Nov 2013 11:47:32 -0800 Subject: [PATCH] builder/docker: config validation test --- builder/docker/builder.go | 6 ++++ builder/docker/config.go | 29 +++++++++++++++ builder/docker/config_test.go | 67 +++++++++++++++++++++++++++++++++++ 3 files changed, 102 insertions(+) create mode 100644 builder/docker/config_test.go diff --git a/builder/docker/builder.go b/builder/docker/builder.go index 09c5826a7..67515b645 100644 --- a/builder/docker/builder.go +++ b/builder/docker/builder.go @@ -25,9 +25,15 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { return nil, err } + // Accumulate any errors errs := common.CheckUnusedConfig(md) warnings := make([]string, 0) + // Validate the configuration + cwarns, cerrs := b.config.Prepare() + errs = packer.MultiErrorAppend(errs, cerrs...) + warnings = append(warnings, cwarns...) + if errs != nil && len(errs.Errors) > 0 { return warnings, errs } diff --git a/builder/docker/config.go b/builder/docker/config.go index 86f3da982..09ef02a06 100644 --- a/builder/docker/config.go +++ b/builder/docker/config.go @@ -1,6 +1,7 @@ package docker import ( + "fmt" "github.com/mitchellh/packer/common" "github.com/mitchellh/packer/packer" ) @@ -13,3 +14,31 @@ type Config struct { tpl *packer.ConfigTemplate } + +func (c *Config) Prepare() ([]string, []error) { + errs := make([]error, 0) + + templates := map[string]*string{ + "export_path": &c.ExportPath, + "image": &c.Image, + } + + for n, ptr := range templates { + var err error + *ptr, err = c.tpl.Process(*ptr, nil) + if err != nil { + errs = append( + errs, fmt.Errorf("Error processing %s: %s", n, err)) + } + } + + if c.ExportPath == "" { + errs = append(errs, fmt.Errorf("export_path must be specified")) + } + + if c.Image == "" { + errs = append(errs, fmt.Errorf("image must be specified")) + } + + return nil, errs +} diff --git a/builder/docker/config_test.go b/builder/docker/config_test.go new file mode 100644 index 000000000..8d083bf70 --- /dev/null +++ b/builder/docker/config_test.go @@ -0,0 +1,67 @@ +package docker + +import ( + "github.com/mitchellh/packer/packer" + "testing" +) + +func testConfigStruct(t *testing.T) *Config { + tpl, err := packer.NewConfigTemplate() + if err != nil { + t.Fatalf("err: %s", err) + } + + return &Config{ + ExportPath: "foo", + Image: "bar", + tpl: tpl, + } +} + +func TestConfigPrepare_exportPath(t *testing.T) { + c := testConfigStruct(t) + + // No export path + c.ExportPath = "" + warns, errs := c.Prepare() + if len(warns) > 0 { + t.Fatalf("bad: %#v", warns) + } + if len(errs) <= 0 { + t.Fatalf("bad: %#v", errs) + } + + // Good export path + c.ExportPath = "path" + warns, errs = c.Prepare() + if len(warns) > 0 { + t.Fatalf("bad: %#v", warns) + } + if len(errs) > 0 { + t.Fatalf("bad: %#v", errs) + } +} + +func TestConfigPrepare_image(t *testing.T) { + c := testConfigStruct(t) + + // No image + c.Image = "" + warns, errs := c.Prepare() + if len(warns) > 0 { + t.Fatalf("bad: %#v", warns) + } + if len(errs) <= 0 { + t.Fatalf("bad: %#v", errs) + } + + // Good image + c.Image = "path" + warns, errs = c.Prepare() + if len(warns) > 0 { + t.Fatalf("bad: %#v", warns) + } + if len(errs) > 0 { + t.Fatalf("bad: %#v", errs) + } +}