diff --git a/builder/virtualbox/common/driver.go b/builder/virtualbox/common/driver.go index a55b20199..add59c7f1 100644 --- a/builder/virtualbox/common/driver.go +++ b/builder/virtualbox/common/driver.go @@ -19,6 +19,9 @@ type Driver interface { // Create a SATA controller. CreateSATAController(vm string, controller string) error + // Create a SCSI controller. + CreateSCSIController(vm string, controller string) error + // Delete a VM by name Delete(string) error diff --git a/builder/virtualbox/common/driver_4_2.go b/builder/virtualbox/common/driver_4_2.go index 3462933cd..c375fba32 100644 --- a/builder/virtualbox/common/driver_4_2.go +++ b/builder/virtualbox/common/driver_4_2.go @@ -36,6 +36,18 @@ func (d *VBox42Driver) CreateSATAController(vmName string, name string) error { return d.VBoxManage(command...) } +func (d *VBox42Driver) CreateSCSIController(vmName string, name string) error { + + command := []string{ + "storagectl", vmName, + "--name", name, + "--add", "scsi", + "--controller", "LSILogic", + } + + return d.VBoxManage(command...) +} + func (d *VBox42Driver) Delete(name string) error { return d.VBoxManage("unregistervm", name, "--delete") } diff --git a/builder/virtualbox/common/driver_mock.go b/builder/virtualbox/common/driver_mock.go index 1aacf9f8f..da08ad072 100644 --- a/builder/virtualbox/common/driver_mock.go +++ b/builder/virtualbox/common/driver_mock.go @@ -9,6 +9,10 @@ type DriverMock struct { CreateSATAControllerController string CreateSATAControllerErr error + CreateSCSIControllerVM string + CreateSCSIControllerController string + CreateSCSIControllerErr error + DeleteCalled bool DeleteName string DeleteErr error @@ -49,6 +53,12 @@ func (d *DriverMock) CreateSATAController(vm string, controller string) error { return d.CreateSATAControllerErr } +func (d *DriverMock) CreateSCSIController(vm string, controller string) error { + d.CreateSCSIControllerVM = vm + d.CreateSCSIControllerController = vm + return d.CreateSCSIControllerErr +} + func (d *DriverMock) Delete(name string) error { d.DeleteCalled = true d.DeleteName = name diff --git a/builder/virtualbox/iso/builder.go b/builder/virtualbox/iso/builder.go index c4c51c892..826d3ffe9 100644 --- a/builder/virtualbox/iso/builder.go +++ b/builder/virtualbox/iso/builder.go @@ -158,9 +158,9 @@ func (b *Builder) Prepare(raws ...interface{}) ([]string, error) { } } - if b.config.HardDriveInterface != "ide" && b.config.HardDriveInterface != "sata" { + if b.config.HardDriveInterface != "ide" && b.config.HardDriveInterface != "sata" && b.config.HardDriveInterface != "scsi" { errs = packer.MultiErrorAppend( - errs, errors.New("hard_drive_interface can only be ide or sata")) + errs, errors.New("hard_drive_interface can only be ide, sata, or scsi")) } if b.config.ISOChecksumType == "" { diff --git a/builder/virtualbox/iso/step_create_disk.go b/builder/virtualbox/iso/step_create_disk.go index 564a2f4d3..82b849dbe 100644 --- a/builder/virtualbox/iso/step_create_disk.go +++ b/builder/virtualbox/iso/step_create_disk.go @@ -63,12 +63,25 @@ func (s *stepCreateDisk) Run(state multistep.StateBag) multistep.StepAction { } } + if config.HardDriveInterface == "scsi" { + if err := driver.CreateSCSIController(vmName, "SCSI Controller"); err != nil { + err := fmt.Errorf("Error creating disk controller: %s", err) + state.Put("error", err) + ui.Error(err.Error()) + return multistep.ActionHalt + } + } + // Attach the disk to the controller controllerName := "IDE Controller" if config.HardDriveInterface == "sata" { controllerName = "SATA Controller" } + if config.HardDriveInterface == "scsi" { + controllerName = "SCSI Controller" + } + command = []string{ "storageattach", vmName, "--storagectl", controllerName, diff --git a/website/source/docs/builders/virtualbox-iso.html.markdown b/website/source/docs/builders/virtualbox-iso.html.markdown index f8a45d352..b97045f16 100644 --- a/website/source/docs/builders/virtualbox-iso.html.markdown +++ b/website/source/docs/builders/virtualbox-iso.html.markdown @@ -136,7 +136,8 @@ each category, the available options are alphabetized and described. * `hard_drive_interface` (string) - The type of controller that the primary hard drive is attached to, defaults to "ide". When set to "sata", the - drive is attached to an AHCI SATA controller. + drive is attached to an AHCI SATA controller. When set to "scsi", the drive + is attached to an LsiLogic SCSI controller. * `headless` (boolean) - Packer defaults to building VirtualBox virtual machines by launching a GUI that shows the console of the