step_create_vm.go 1.52 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
package virtualbox

import (
	"fmt"
	"github.com/mitchellh/multistep"
	"github.com/mitchellh/packer/packer"
	"time"
)

// This step creates the actual virtual machine.
type stepCreateVM struct{
	vmName string
}

func (s *stepCreateVM) Run(state map[string]interface{}) multistep.StepAction {
	config := state["config"].(*config)
	driver := state["driver"].(Driver)
	ui := state["ui"].(packer.Ui)

	name := config.VMName

	commands := make([][]string, 4)
	commands[0] = []string{"createvm", "--name", name, "--ostype", config.GuestOSType, "--register"}
	commands[1] = []string{
		"modifyvm", name,
		"--boot1", "disk", "--boot2", "dvd", "--boot3", "none", "--boot4", "none",
	}
	commands[2] = []string{"modifyvm", name, "--cpus", "1"}
	commands[3] = []string{"modifyvm", name, "--memory", "512"}

	ui.Say("Creating virtual machine...")
	for _, command := range commands {
		err := driver.VBoxManage(command...)
		if err != nil {
			ui.Error(fmt.Sprintf("Error creating VM: %s", err))
			return multistep.ActionHalt
		}

		// Set the VM name propery on the first command
		if s.vmName == "" {
			s.vmName = name
		}
	}

	time.Sleep(15 * time.Second)
	return multistep.ActionContinue
}

func (s *stepCreateVM) Cleanup(state map[string]interface{}) {
	if s.vmName == "" {
		return
	}

	driver := state["driver"].(Driver)
	ui := state["ui"].(packer.Ui)

	ui.Say("Unregistering and deleting virtual machine...")
	if err := driver.VBoxManage("unregistervm", s.vmName, "--delete"); err != nil {
		ui.Error(fmt.Sprintf("Error deleting virtual machine: %s", err))
	}
}