diff options
Diffstat (limited to 'vendor/github.com/mitchellh/packer/builder/lxc/step_lxc_create.go')
-rw-r--r-- | vendor/github.com/mitchellh/packer/builder/lxc/step_lxc_create.go | 89 |
1 files changed, 89 insertions, 0 deletions
diff --git a/vendor/github.com/mitchellh/packer/builder/lxc/step_lxc_create.go b/vendor/github.com/mitchellh/packer/builder/lxc/step_lxc_create.go new file mode 100644 index 00000000..a98926ff --- /dev/null +++ b/vendor/github.com/mitchellh/packer/builder/lxc/step_lxc_create.go @@ -0,0 +1,89 @@ +package lxc + +import ( + "bytes" + "fmt" + "github.com/hashicorp/packer/packer" + "github.com/mitchellh/multistep" + "log" + "os/exec" + "path/filepath" + "strings" +) + +type stepLxcCreate struct{} + +func (s *stepLxcCreate) Run(state multistep.StateBag) multistep.StepAction { + config := state.Get("config").(*Config) + ui := state.Get("ui").(packer.Ui) + + name := config.ContainerName + + // TODO: read from env + lxc_dir := "/var/lib/lxc" + rootfs := filepath.Join(lxc_dir, name, "rootfs") + + if config.PackerForce { + s.Cleanup(state) + } + + commands := make([][]string, 3) + commands[0] = append(config.EnvVars, []string{"lxc-create", "-n", name, "-t", config.Name, "--"}...) + commands[0] = append(commands[0], config.Parameters...) + // prevent tmp from being cleaned on boot, we put provisioning scripts there + // todo: wait for init to finish before moving on to provisioning instead of this + commands[1] = []string{"touch", filepath.Join(rootfs, "tmp", ".tmpfs")} + commands[2] = []string{"lxc-start", "-d", "--name", name} + + ui.Say("Creating container...") + for _, command := range commands { + log.Printf("Executing sudo command: %#v", command) + err := s.SudoCommand(command...) + if err != nil { + err := fmt.Errorf("Error creating container: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + } + + state.Put("mount_path", rootfs) + + return multistep.ActionContinue +} + +func (s *stepLxcCreate) Cleanup(state multistep.StateBag) { + config := state.Get("config").(*Config) + ui := state.Get("ui").(packer.Ui) + + command := []string{ + "lxc-destroy", "-f", "-n", config.ContainerName, + } + + ui.Say("Unregistering and deleting virtual machine...") + if err := s.SudoCommand(command...); err != nil { + ui.Error(fmt.Sprintf("Error deleting virtual machine: %s", err)) + } +} + +func (s *stepLxcCreate) SudoCommand(args ...string) error { + var stdout, stderr bytes.Buffer + + log.Printf("Executing sudo command: %#v", args) + cmd := exec.Command("sudo", args...) + cmd.Stdout = &stdout + cmd.Stderr = &stderr + err := cmd.Run() + + stdoutString := strings.TrimSpace(stdout.String()) + stderrString := strings.TrimSpace(stderr.String()) + + if _, ok := err.(*exec.ExitError); ok { + err = fmt.Errorf("Sudo command error: %s", stderrString) + } + + log.Printf("stdout: %s", stdoutString) + log.Printf("stderr: %s", stderrString) + + return err +} |