From e0ab81aee3b18ccd0e11d1b34d04496439f711a1 Mon Sep 17 00:00:00 2001 From: Mitchell Hashimoto Date: Thu, 27 Jun 2013 07:33:32 -0700 Subject: [PATCH] post-processor/vagrant: VirtualBox post-processor --- post-processor/vagrant/virtualbox.go | 98 +++++++++++++++++++++++ post-processor/vagrant/virtualbox_test.go | 14 ++++ 2 files changed, 112 insertions(+) create mode 100644 post-processor/vagrant/virtualbox.go create mode 100644 post-processor/vagrant/virtualbox_test.go diff --git a/post-processor/vagrant/virtualbox.go b/post-processor/vagrant/virtualbox.go new file mode 100644 index 000000000..766e86c8d --- /dev/null +++ b/post-processor/vagrant/virtualbox.go @@ -0,0 +1,98 @@ +package vagrant + +import ( + "fmt" + "github.com/mitchellh/mapstructure" + "github.com/mitchellh/packer/packer" + "io" + "io/ioutil" + "os" + "path/filepath" + "text/template" +) + +type VBoxBoxConfig struct { + OutputPath string `mapstructure:"output"` +} + +type VBoxVagrantfileTemplate struct { + BaseMacAddress string +} + +type VBoxBoxPostProcessor struct { + config VBoxBoxConfig +} + +func (p *VBoxBoxPostProcessor) Configure(raw interface{}) error { + err := mapstructure.Decode(raw, &p.config) + if err != nil { + return err + } + + return nil +} + +func (p *VBoxBoxPostProcessor) PostProcess(ui packer.Ui, artifact packer.Artifact) (packer.Artifact, error) { + // TODO(mitchellh): Actually parse the base mac address + tplData := &VBoxVagrantfileTemplate{} + + // Create a temporary directory for us to build the contents of the box in + dir, err := ioutil.TempDir("", "packer") + if err != nil { + return nil, err + } + defer os.RemoveAll(dir) + + // Copy all of the original contents into the temporary directory + for _, path := range artifact.Files() { + ui.Message(fmt.Sprintf("Copying: %s", path)) + src, err := os.Open(path) + if err != nil { + return nil, err + } + defer src.Close() + + dst, err := os.Create(filepath.Join(dir, filepath.Base(path))) + if err != nil { + return nil, err + } + defer dst.Close() + + if _, err := io.Copy(dst, src); err != nil { + return nil, err + } + } + + // Create the Vagrantfile from the template + vf, err := os.Create(filepath.Join(dir, "Vagrantfile")) + if err != nil { + return nil, err + } + defer vf.Close() + + t := template.Must(template.New("vagrantfile").Parse(defaultVBoxVagrantfile)) + t.Execute(vf, tplData) + vf.Close() + + // Create the metadata + metadata := map[string]string{"provider": "virtualbox"} + if err := WriteMetadata(dir, metadata); err != nil { + return nil, err + } + + // Compress the directory to the given output path + ui.Message(fmt.Sprintf("Compressing box...")) + if err := DirToBox(p.config.OutputPath, dir); err != nil { + return nil, err + } + + return NewArtifact("virtualbox", p.config.OutputPath), nil +} + +var defaultVBoxVagrantfile = ` +Vagrant.configure("2") do |config| + config.vm.provider "virtualbox" do |vb| + # TODO + end +end +` diff --git a/post-processor/vagrant/virtualbox_test.go b/post-processor/vagrant/virtualbox_test.go new file mode 100644 index 000000000..eb525c29b --- /dev/null +++ b/post-processor/vagrant/virtualbox_test.go @@ -0,0 +1,14 @@ +package vagrant + +import ( + "github.com/mitchellh/packer/packer" + "testing" +) + +func TestVBoxBoxPostProcessor_ImplementsPostProcessor(t *testing.T) { + var raw interface{} + raw = &VBoxBoxPostProcessor{} + if _, ok := raw.(packer.PostProcessor); !ok { + t.Fatalf("VBox PostProcessor should be a PostProcessor") + } +}