From c1a9728448c8df63c05a58f05fd2270535288be0 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 19 Dec 2013 13:37:09 -0800 Subject: [PATCH] post-processor/vagrant: transition aws over --- post-processor/vagrant/aws.go | 151 ++++------------------------- post-processor/vagrant/aws_test.go | 9 +- 2 files changed, 21 insertions(+), 139 deletions(-) diff --git a/post-processor/vagrant/aws.go b/post-processor/vagrant/aws.go index 04ef43ec0..04e074bc5 100644 --- a/post-processor/vagrant/aws.go +++ b/post-processor/vagrant/aws.go @@ -1,157 +1,44 @@ package vagrant import ( - "compress/flate" + "bytes" "fmt" - "github.com/mitchellh/packer/common" "github.com/mitchellh/packer/packer" - "io/ioutil" - "log" - "os" - "path/filepath" - "strconv" "strings" + "text/template" ) -type AWSBoxConfig struct { - common.PackerConfig `mapstructure:",squash"` +type AWSProvider struct{} - OutputPath string `mapstructure:"output"` - VagrantfileTemplate string `mapstructure:"vagrantfile_template"` - CompressionLevel string `mapstructure:"compression_level"` +func (p *AWSProvider) Process(ui packer.Ui, artifact packer.Artifact, dir string) (vagrantfile string, metadata map[string]interface{}, err error) { + // Create the metadata + metadata = map[string]interface{}{"provider": "aws"} - tpl *packer.ConfigTemplate -} - -type AWSVagrantfileTemplate struct { - Images map[string]string -} - -type AWSBoxPostProcessor struct { - config AWSBoxConfig -} - -func (p *AWSBoxPostProcessor) Configure(raws ...interface{}) error { - md, err := common.DecodeConfig(&p.config, raws...) - if err != nil { - return err - } - - p.config.tpl, err = packer.NewConfigTemplate() - if err != nil { - return err - } - p.config.tpl.UserVars = p.config.PackerUserVars - - // Accumulate any errors - errs := common.CheckUnusedConfig(md) - - validates := map[string]*string{ - "output": &p.config.OutputPath, - "vagrantfile_template": &p.config.VagrantfileTemplate, - "compression_level": &p.config.CompressionLevel, - } - - for n, ptr := range validates { - if err := p.config.tpl.Validate(*ptr); err != nil { - errs = packer.MultiErrorAppend( - errs, fmt.Errorf("Error parsing %s: %s", n, err)) - } - } - - if errs != nil && len(errs.Errors) > 0 { - return errs - } - - return nil -} - -func (p *AWSBoxPostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, bool, error) { - // Determine the regions... - tplData := &AWSVagrantfileTemplate{ + // Build up the template data to build our Vagrantfile + tplData := &awsVagrantfileTemplate{ Images: make(map[string]string), } for _, regions := range strings.Split(artifact.Id(), ",") { parts := strings.Split(regions, ":") if len(parts) != 2 { - return nil, false, fmt.Errorf("Poorly formatted artifact ID: %s", artifact.Id()) + err = fmt.Errorf("Poorly formatted artifact ID: %s", artifact.Id()) + return } tplData.Images[parts[0]] = parts[1] } - // Compile the output path - outputPath, err := p.config.tpl.Process(p.config.OutputPath, &OutputPathTemplate{ - ArtifactId: artifact.Id(), - BuildName: p.config.PackerBuildName, - Provider: "aws", - }) - if err != nil { - return nil, false, err - } + // Build up the contents + var contents bytes.Buffer + t := template.Must(template.New("vf").Parse(defaultAWSVagrantfile)) + err = t.Execute(&contents, tplData) + vagrantfile = contents.String() + return +} - // Create a temporary directory for us to build the contents of the box in - dir, err := ioutil.TempDir("", "packer") - if err != nil { - return nil, false, err - } - defer os.RemoveAll(dir) - - // Create the Vagrantfile from the template - vf, err := os.Create(filepath.Join(dir, "Vagrantfile")) - if err != nil { - return nil, false, err - } - defer vf.Close() - - vagrantfileContents := defaultAWSVagrantfile - if p.config.VagrantfileTemplate != "" { - log.Printf("Using vagrantfile template: %s", p.config.VagrantfileTemplate) - f, err := os.Open(p.config.VagrantfileTemplate) - if err != nil { - err = fmt.Errorf("error opening vagrantfile template: %s", err) - return nil, false, err - } - defer f.Close() - - contents, err := ioutil.ReadAll(f) - if err != nil { - err = fmt.Errorf("error reading vagrantfile template: %s", err) - return nil, false, err - } - - vagrantfileContents = string(contents) - } - - vagrantfileContents, err = p.config.tpl.Process(vagrantfileContents, tplData) - if err != nil { - return nil, false, fmt.Errorf("Error writing Vagrantfile: %s", err) - } - vf.Write([]byte(vagrantfileContents)) - vf.Close() - - var level int = flate.DefaultCompression - if p.config.CompressionLevel != "" { - level, err = strconv.Atoi(p.config.CompressionLevel) - if err != nil { - return nil, false, err - } - } - - // Create the metadata - metadata := map[string]string{"provider": "aws"} - if err := WriteMetadata(dir, metadata); err != nil { - return nil, false, err - } - - // Compress the directory to the given output path - if err := DirToBox(outputPath, dir, ui, level); err != nil { - err = fmt.Errorf("error creating box: %s", err) - return nil, false, err - } - - return NewArtifact("aws", outputPath), true, nil +type awsVagrantfileTemplate struct { + Images map[string]string } var defaultAWSVagrantfile = ` diff --git a/post-processor/vagrant/aws_test.go b/post-processor/vagrant/aws_test.go index 7c7d6fcc3..f685e030e 100644 --- a/post-processor/vagrant/aws_test.go +++ b/post-processor/vagrant/aws_test.go @@ -1,14 +1,9 @@ package vagrant import ( - "github.com/mitchellh/packer/packer" "testing" ) -func TestAWSBoxPostProcessor_ImplementsPostProcessor(t *testing.T) { - var raw interface{} - raw = &AWSBoxPostProcessor{} - if _, ok := raw.(packer.PostProcessor); !ok { - t.Fatalf("AWS PostProcessor should be a PostProcessor") - } +func TestAWSProvider_impl(t *testing.T) { + var _ Provider = new(AWSProvider) }