diff --git a/builder/vsphere/driver/vm_cdrom.go b/builder/vsphere/driver/vm_cdrom.go index c5d7e29ed..d33b75829 100644 --- a/builder/vsphere/driver/vm_cdrom.go +++ b/builder/vsphere/driver/vm_cdrom.go @@ -51,6 +51,23 @@ func (vm *VirtualMachine) CreateCdrom(c *types.VirtualController) (*types.Virtua return device, nil } +func (vm *VirtualMachine) RemoveCdroms() error { + devices, err := vm.Devices() + if err != nil { + return err + } + cdroms := devices.SelectByType((*types.VirtualCdrom)(nil)) + if err = vm.RemoveDevice(true, cdroms...); err != nil { + return err + } + + sata := devices.SelectByType((*types.VirtualAHCIController)(nil)) + if err = vm.RemoveDevice(true, sata...); err != nil { + return err + } + return nil +} + func (vm *VirtualMachine) EjectCdroms() error { devices, err := vm.Devices() if err != nil { diff --git a/builder/vsphere/iso/builder.go b/builder/vsphere/iso/builder.go index 1f6a2bd20..9702cc96a 100644 --- a/builder/vsphere/iso/builder.go +++ b/builder/vsphere/iso/builder.go @@ -121,7 +121,9 @@ func (b *Builder) Run(ctx context.Context, ui packer.Ui, hook packer.Hook) (pack } steps = append(steps, - &StepRemoveCDRom{}, + &StepRemoveCDRom{ + Config: &b.config.RemoveCDRomConfig, + }, &common.StepCreateSnapshot{ CreateSnapshot: b.config.CreateSnapshot, }, diff --git a/builder/vsphere/iso/config.go b/builder/vsphere/iso/config.go index e3c297fa4..991827c94 100644 --- a/builder/vsphere/iso/config.go +++ b/builder/vsphere/iso/config.go @@ -24,6 +24,7 @@ type Config struct { packerCommon.ISOConfig `mapstructure:",squash"` CDRomConfig `mapstructure:",squash"` + RemoveCDRomConfig `mapstructure:",squash"` FloppyConfig `mapstructure:",squash"` common.RunConfig `mapstructure:",squash"` BootConfig `mapstructure:",squash"` diff --git a/builder/vsphere/iso/step_remove_cdrom.go b/builder/vsphere/iso/step_remove_cdrom.go index bd2e560cd..afc09344e 100644 --- a/builder/vsphere/iso/step_remove_cdrom.go +++ b/builder/vsphere/iso/step_remove_cdrom.go @@ -7,7 +7,13 @@ import ( "github.com/hashicorp/packer/packer" ) -type StepRemoveCDRom struct{} +type RemoveCDRomConfig struct { + RemoveCdrom bool `mapstructure:"remove_cdrom"` +} + +type StepRemoveCDRom struct { + Config *RemoveCDRomConfig +} func (s *StepRemoveCDRom) Run(_ context.Context, state multistep.StateBag) multistep.StepAction { ui := state.Get("ui").(packer.Ui) @@ -20,7 +26,16 @@ func (s *StepRemoveCDRom) Run(_ context.Context, state multistep.StateBag) multi return multistep.ActionHalt } - return multistep.ActionContinue + if s.Config.RemoveCdrom == true { + ui.Say("Deleting CD-ROM drives...") + err := vm.RemoveCdroms() + if err != nil { + state.Put("error", err) + return multistep.ActionHalt + } + } + + return multistep.ActionContinue } func (s *StepRemoveCDRom) Cleanup(state multistep.StateBag) {}