|
|
|
|
@ -35,16 +35,13 @@ func cancelCallback(state multistep.StateBag) bool {
|
|
|
|
|
return cancel
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *stepRun) runVM(
|
|
|
|
|
sendBootCommands bool,
|
|
|
|
|
func (s *stepRun) getCommandArgs(
|
|
|
|
|
bootDrive string,
|
|
|
|
|
state multistep.StateBag) multistep.StepAction {
|
|
|
|
|
state multistep.StateBag) []string {
|
|
|
|
|
|
|
|
|
|
config := state.Get("config").(*config)
|
|
|
|
|
driver := state.Get("driver").(Driver)
|
|
|
|
|
ui := state.Get("ui").(packer.Ui)
|
|
|
|
|
config := state.Get("config").(*config)
|
|
|
|
|
vmName := config.VMName
|
|
|
|
|
|
|
|
|
|
imgPath := filepath.Join(config.OutputDir,
|
|
|
|
|
fmt.Sprintf("%s.%s", vmName, strings.ToLower(config.Format)))
|
|
|
|
|
isoPath := state.Get("iso_path").(string)
|
|
|
|
|
@ -53,7 +50,6 @@ func (s *stepRun) runVM(
|
|
|
|
|
sshHostPort := state.Get("sshHostPort").(uint)
|
|
|
|
|
vnc := fmt.Sprintf("0.0.0.0:%d", vncPort-5900)
|
|
|
|
|
|
|
|
|
|
ui.Say("Starting the virtual machine for OS Install...")
|
|
|
|
|
if config.Headless == true {
|
|
|
|
|
ui.Message("WARNING: The VM will be started in headless mode, as configured.\n" +
|
|
|
|
|
"In headless mode, errors during the boot sequence or OS setup\n" +
|
|
|
|
|
@ -61,19 +57,74 @@ func (s *stepRun) runVM(
|
|
|
|
|
guiArgument = "none"
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
command := []string{
|
|
|
|
|
"-name", vmName,
|
|
|
|
|
"-machine", fmt.Sprintf("type=pc-1.0,accel=%s", config.Accelerator),
|
|
|
|
|
"-display", guiArgument,
|
|
|
|
|
"-net", fmt.Sprintf("nic,model=%s", config.NetDevice),
|
|
|
|
|
"-net", "user",
|
|
|
|
|
"-drive", fmt.Sprintf("file=%s,if=%s", imgPath, config.DiskInterface),
|
|
|
|
|
"-cdrom", isoPath,
|
|
|
|
|
"-boot", bootDrive,
|
|
|
|
|
"-m", "512m",
|
|
|
|
|
"-redir", fmt.Sprintf("tcp:%v::22", sshHostPort),
|
|
|
|
|
"-vnc", vnc,
|
|
|
|
|
defaultArgs := make(map[string]string)
|
|
|
|
|
defaultArgs["-name"] = vmName
|
|
|
|
|
defaultArgs["-machine"] = fmt.Sprintf("type=pc-1.0,accel=%s", config.Accelerator)
|
|
|
|
|
defaultArgs["-display"] = guiArgument
|
|
|
|
|
defaultArgs["-netdev"] = "user,id=user.0"
|
|
|
|
|
defaultArgs["-device"] = fmt.Sprintf("%s,netdev=user.0", config.NetDevice)
|
|
|
|
|
defaultArgs["-drive"] = fmt.Sprintf("file=%s,if=%s", imgPath, config.DiskInterface)
|
|
|
|
|
defaultArgs["-cdrom"] = isoPath
|
|
|
|
|
defaultArgs["-boot"] = bootDrive
|
|
|
|
|
defaultArgs["-m"] = "512m"
|
|
|
|
|
defaultArgs["-redir"] = fmt.Sprintf("tcp:%v::22", sshHostPort)
|
|
|
|
|
defaultArgs["-vnc"] = vnc
|
|
|
|
|
|
|
|
|
|
inArgs := make(map[string][]string)
|
|
|
|
|
if len(config.QemuArgs) > 0 {
|
|
|
|
|
ui.Say("Overriding defaults Qemu arguments with QemuArgs...")
|
|
|
|
|
|
|
|
|
|
// becuase qemu supports multiple appearances of the same
|
|
|
|
|
// switch, just different values, each key in the args hash
|
|
|
|
|
// will have an array of string values
|
|
|
|
|
for _, qemuArgs := range config.QemuArgs {
|
|
|
|
|
key := qemuArgs[0]
|
|
|
|
|
val := strings.Join(qemuArgs[1:], "")
|
|
|
|
|
if _, ok := inArgs[key]; !ok {
|
|
|
|
|
inArgs[key] = make([]string, 0)
|
|
|
|
|
}
|
|
|
|
|
if len(val) > 0 {
|
|
|
|
|
inArgs[key] = append(inArgs[key], val)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// get any remaining missing default args from the default settings
|
|
|
|
|
for key := range defaultArgs {
|
|
|
|
|
if _, ok := inArgs[key]; !ok {
|
|
|
|
|
arg := make([]string, 1)
|
|
|
|
|
arg[0] = defaultArgs[key]
|
|
|
|
|
inArgs[key] = arg
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Flatten to array of strings
|
|
|
|
|
outArgs := make([]string, 0)
|
|
|
|
|
for key, values := range inArgs {
|
|
|
|
|
if len(values) > 0 {
|
|
|
|
|
for idx := range values {
|
|
|
|
|
outArgs = append(outArgs, key, values[idx])
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
outArgs = append(outArgs, key)
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return outArgs
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
func (s *stepRun) runVM(
|
|
|
|
|
sendBootCommands bool,
|
|
|
|
|
bootDrive string,
|
|
|
|
|
state multistep.StateBag) multistep.StepAction {
|
|
|
|
|
|
|
|
|
|
config := state.Get("config").(*config)
|
|
|
|
|
driver := state.Get("driver").(Driver)
|
|
|
|
|
ui := state.Get("ui").(packer.Ui)
|
|
|
|
|
vmName := config.VMName
|
|
|
|
|
|
|
|
|
|
ui.Say("Starting the virtual machine for OS Install...")
|
|
|
|
|
command := s.getCommandArgs(bootDrive, state)
|
|
|
|
|
if err := driver.Qemu(vmName, command...); err != nil {
|
|
|
|
|
err := fmt.Errorf("Error launching VM: %s", err)
|
|
|
|
|
ui.Error(err.Error())
|
|
|
|
|
|