Merge pull request #8828 from mvitaly/fix_8816
Remove all floppy controllers before adding a new one
This commit is contained in:
commit
7e382d0df7
|
@ -25,6 +25,9 @@ type Driver interface {
|
||||||
// Create an NVME controller
|
// Create an NVME controller
|
||||||
CreateNVMeController(vm string, controller string, portcount int) error
|
CreateNVMeController(vm string, controller string, portcount int) error
|
||||||
|
|
||||||
|
// Delete all floppy controllers
|
||||||
|
RemoveFloppyControllers(vm string) error
|
||||||
|
|
||||||
// Delete a VM by name
|
// Delete a VM by name
|
||||||
Delete(string) error
|
Delete(string) error
|
||||||
|
|
||||||
|
|
|
@ -75,6 +75,55 @@ func (d *VBox42Driver) CreateSCSIController(vmName string, name string) error {
|
||||||
return d.VBoxManage(command...)
|
return d.VBoxManage(command...)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *VBox42Driver) RemoveFloppyControllers(vmName string) error {
|
||||||
|
var stdout bytes.Buffer
|
||||||
|
|
||||||
|
cmd := exec.Command(d.VBoxManagePath, "showvminfo", vmName, "--machinereadable")
|
||||||
|
cmd.Stdout = &stdout
|
||||||
|
if err := cmd.Run(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
|
||||||
|
StorageControllerTypeRe := regexp.MustCompile("^storagecontrollertype([0-9]+)=\"(.+)\"$")
|
||||||
|
StorageControllerNameRe := regexp.MustCompile("^storagecontrollername([0-9]+)=\"(.+)\"$")
|
||||||
|
|
||||||
|
storageControllerNames := make(map[string]string)
|
||||||
|
storageControllerIdx := ""
|
||||||
|
|
||||||
|
for _, line := range strings.Split(stdout.String(), "\n") {
|
||||||
|
// Need to trim off CR character when running in windows
|
||||||
|
// Trimming whitespaces at this point helps to filter out empty value
|
||||||
|
line = strings.TrimRight(line, " \r")
|
||||||
|
|
||||||
|
matches := StorageControllerTypeRe.FindStringSubmatch(line)
|
||||||
|
if matches != nil {
|
||||||
|
// Floppy controllers are of a type I82078
|
||||||
|
if matches[2] == "I82078" {
|
||||||
|
// VirtualBox supports only one floppy controller per VM
|
||||||
|
storageControllerIdx = matches[1]
|
||||||
|
}
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
|
||||||
|
matches = StorageControllerNameRe.FindStringSubmatch(line)
|
||||||
|
if matches != nil {
|
||||||
|
storageControllerNames[matches[1]] = matches[2]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if storageControllerIdx == "" {
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
command := []string{
|
||||||
|
"storagectl", vmName,
|
||||||
|
"--name", storageControllerNames[storageControllerIdx],
|
||||||
|
"--remove",
|
||||||
|
}
|
||||||
|
|
||||||
|
return d.VBoxManage(command...)
|
||||||
|
}
|
||||||
|
|
||||||
func (d *VBox42Driver) Delete(name string) error {
|
func (d *VBox42Driver) Delete(name string) error {
|
||||||
return d.VBoxManage("unregistervm", name, "--delete")
|
return d.VBoxManage("unregistervm", name, "--delete")
|
||||||
}
|
}
|
||||||
|
|
|
@ -17,6 +17,9 @@ type DriverMock struct {
|
||||||
CreateNVMeControllerController string
|
CreateNVMeControllerController string
|
||||||
CreateNVMeControllerErr error
|
CreateNVMeControllerErr error
|
||||||
|
|
||||||
|
RemoveFloppyControllersVM string
|
||||||
|
RemoveFloppyControllersErr error
|
||||||
|
|
||||||
DeleteCalled bool
|
DeleteCalled bool
|
||||||
DeleteName string
|
DeleteName string
|
||||||
DeleteErr error
|
DeleteErr error
|
||||||
|
@ -81,6 +84,11 @@ func (d *DriverMock) CreateNVMeController(vm string, controller string, portcoun
|
||||||
return d.CreateNVMeControllerErr
|
return d.CreateNVMeControllerErr
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (d *DriverMock) RemoveFloppyControllers(vm string) error {
|
||||||
|
d.RemoveFloppyControllersVM = vm
|
||||||
|
return d.RemoveFloppyControllersErr
|
||||||
|
}
|
||||||
|
|
||||||
func (d *DriverMock) Delete(name string) error {
|
func (d *DriverMock) Delete(name string) error {
|
||||||
d.DeleteCalled = true
|
d.DeleteCalled = true
|
||||||
d.DeleteName = name
|
d.DeleteName = name
|
||||||
|
|
|
@ -48,6 +48,12 @@ func (s *StepAttachFloppy) Run(ctx context.Context, state multistep.StateBag) mu
|
||||||
ui := state.Get("ui").(packer.Ui)
|
ui := state.Get("ui").(packer.Ui)
|
||||||
vmName := state.Get("vmName").(string)
|
vmName := state.Get("vmName").(string)
|
||||||
|
|
||||||
|
ui.Say("Deleting any current floppy disk...")
|
||||||
|
if err := driver.RemoveFloppyControllers(vmName); err != nil {
|
||||||
|
state.Put("error", fmt.Errorf("Error deleting existing floppy controllers: %s", err))
|
||||||
|
return multistep.ActionHalt
|
||||||
|
}
|
||||||
|
|
||||||
ui.Say("Attaching floppy disk...")
|
ui.Say("Attaching floppy disk...")
|
||||||
|
|
||||||
// Create the floppy disk controller
|
// Create the floppy disk controller
|
||||||
|
|
|
@ -38,6 +38,10 @@ func TestStepAttachFloppy(t *testing.T) {
|
||||||
t.Fatal("should NOT have error")
|
t.Fatal("should NOT have error")
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if driver.RemoveFloppyControllersVM == "" {
|
||||||
|
t.Fatal("RemoveFloppyControllers was not called")
|
||||||
|
}
|
||||||
|
|
||||||
if len(driver.VBoxManageCalls) != 2 {
|
if len(driver.VBoxManageCalls) != 2 {
|
||||||
t.Fatal("not enough calls to VBoxManage")
|
t.Fatal("not enough calls to VBoxManage")
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue