diff options
Diffstat (limited to 'vendor/github.com/mitchellh/packer/builder/lxc/builder.go')
-rw-r--r-- | vendor/github.com/mitchellh/packer/builder/lxc/builder.go | 95 |
1 files changed, 95 insertions, 0 deletions
diff --git a/vendor/github.com/mitchellh/packer/builder/lxc/builder.go b/vendor/github.com/mitchellh/packer/builder/lxc/builder.go new file mode 100644 index 00000000..31770b740 --- /dev/null +++ b/vendor/github.com/mitchellh/packer/builder/lxc/builder.go @@ -0,0 +1,95 @@ +package lxc + +import ( + "github.com/hashicorp/packer/common" + "github.com/hashicorp/packer/packer" + "github.com/hashicorp/packer/template/interpolate" + "github.com/mitchellh/multistep" + "log" + "os" + "path/filepath" +) + +// The unique ID for this builder +const BuilderId = "ustream.lxc" + +type wrappedCommandTemplate struct { + Command string +} + +type Builder struct { + config *Config + runner multistep.Runner +} + +func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { + c, errs := NewConfig(raws...) + if errs != nil { + return nil, errs + } + b.config = c + + return nil, nil +} + +func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packer.Artifact, error) { + wrappedCommand := func(command string) (string, error) { + b.config.ctx.Data = &wrappedCommandTemplate{Command: command} + return interpolate.Render(b.config.CommandWrapper, &b.config.ctx) + } + + steps := []multistep.Step{ + new(stepPrepareOutputDir), + new(stepLxcCreate), + &StepWaitInit{ + WaitTimeout: b.config.InitTimeout, + }, + new(StepProvision), + new(stepExport), + } + + // Setup the state bag + state := new(multistep.BasicStateBag) + state.Put("config", b.config) + state.Put("cache", cache) + state.Put("hook", hook) + state.Put("ui", ui) + state.Put("wrappedCommand", CommandWrapper(wrappedCommand)) + + // Run + b.runner = common.NewRunnerWithPauseFn(steps, b.config.PackerConfig, ui, state) + b.runner.Run(state) + + // If there was an error, return that + if rawErr, ok := state.GetOk("error"); ok { + return nil, rawErr.(error) + } + + // Compile the artifact list + files := make([]string, 0, 5) + visit := func(path string, info os.FileInfo, err error) error { + if !info.IsDir() { + files = append(files, path) + } + + return err + } + + if err := filepath.Walk(b.config.OutputDir, visit); err != nil { + return nil, err + } + + artifact := &Artifact{ + dir: b.config.OutputDir, + f: files, + } + + return artifact, nil +} + +func (b *Builder) Cancel() { + if b.runner != nil { + log.Println("Cancelling the step runner...") + b.runner.Cancel() + } +} |