fix cdrom and floppy drive unmounting issue when creating templates (#82)

This commit is contained in:
Asier Marruedo 2018-04-25 11:23:37 +02:00 committed by Michael Kuzmin
parent 6029bfe9e3
commit 115811d410
5 changed files with 104 additions and 52 deletions

View File

@ -2,11 +2,11 @@ package iso
import ( import (
packerCommon "github.com/hashicorp/packer/common" packerCommon "github.com/hashicorp/packer/common"
"github.com/hashicorp/packer/helper/communicator"
"github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/packer"
"github.com/jetbrains-infra/packer-builder-vsphere/common" "github.com/jetbrains-infra/packer-builder-vsphere/common"
"github.com/jetbrains-infra/packer-builder-vsphere/driver" "github.com/jetbrains-infra/packer-builder-vsphere/driver"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
"github.com/hashicorp/packer/helper/communicator"
) )
type Builder struct { type Builder struct {
@ -32,6 +32,12 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
var steps []multistep.Step var steps []multistep.Step
var stepAddFloppy = &StepAddFloppy{
Config: &b.config.FloppyConfig,
Datastore: b.config.Datastore,
Host: b.config.Host,
}
steps = append(steps, steps = append(steps,
&common.StepConnect{ &common.StepConnect{
Config: &b.config.ConnectConfig, Config: &b.config.ConnectConfig,
@ -46,11 +52,7 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
Files: b.config.FloppyFiles, Files: b.config.FloppyFiles,
Directories: b.config.FloppyDirectories, Directories: b.config.FloppyDirectories,
}, },
&StepAddFloppy{ stepAddFloppy,
Config: &b.config.FloppyConfig,
Datastore: b.config.Datastore,
Host: b.config.Host,
},
&StepConfigParams{ &StepConfigParams{
Config: &b.config.ConfigParamsConfig, Config: &b.config.ConfigParamsConfig,
}, },
@ -78,6 +80,12 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
} }
steps = append(steps, steps = append(steps,
&StepRemoveCDRom{},
&StepRemoveFloppy{
Datastore: b.config.Datastore,
Host: b.config.Host,
UploadedFloppyPath: stepAddFloppy.uploadedFloppyPath,
},
&common.StepCreateSnapshot{ &common.StepCreateSnapshot{
CreateSnapshot: b.config.CreateSnapshot, CreateSnapshot: b.config.CreateSnapshot,
}, },

View File

@ -1,11 +1,11 @@
package iso package iso
import ( import (
"fmt"
"github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/packer"
"github.com/jetbrains-infra/packer-builder-vsphere/driver" "github.com/jetbrains-infra/packer-builder-vsphere/driver"
"github.com/mitchellh/multistep" "github.com/mitchellh/multistep"
"fmt"
"github.com/vmware/govmomi/vim25/types"
) )
type CDRomConfig struct { type CDRomConfig struct {
@ -40,16 +40,4 @@ func (s *StepAddCDRom) Run(state multistep.StateBag) multistep.StepAction {
return multistep.ActionContinue return multistep.ActionContinue
} }
func (s *StepAddCDRom) Cleanup(state multistep.StateBag) { func (s *StepAddCDRom) Cleanup(state multistep.StateBag) {}
ui := state.Get("ui").(packer.Ui)
vm := state.Get("vm").(*driver.VirtualMachine)
devices, err := vm.Devices()
if err != nil {
ui.Error(fmt.Sprintf("error removing cdroms: %v", err))
}
cdroms := devices.SelectByType((*types.VirtualCdrom)(nil))
if err = vm.RemoveDevice(false, cdroms...); err != nil {
ui.Error(fmt.Sprintf("error removing cdroms: %v", err))
}
}

View File

@ -1,11 +1,11 @@
package iso package iso
import ( import (
"github.com/mitchellh/multistep" "fmt"
"github.com/hashicorp/packer/packer" "github.com/hashicorp/packer/packer"
"github.com/jetbrains-infra/packer-builder-vsphere/driver" "github.com/jetbrains-infra/packer-builder-vsphere/driver"
"fmt" "github.com/mitchellh/multistep"
"github.com/vmware/govmomi/vim25/types"
) )
type FloppyConfig struct { type FloppyConfig struct {
@ -88,29 +88,4 @@ func (s *StepAddFloppy) runImpl(state multistep.StateBag) error {
return nil return nil
} }
func (s *StepAddFloppy) Cleanup(state multistep.StateBag) { func (s *StepAddFloppy) Cleanup(state multistep.StateBag) {}
ui := state.Get("ui").(packer.Ui)
vm := state.Get("vm").(*driver.VirtualMachine)
d := state.Get("driver").(*driver.Driver)
devices, err := vm.Devices()
if err != nil {
ui.Error(fmt.Sprintf("error removing floppy: %v", err))
}
cdroms := devices.SelectByType((*types.VirtualFloppy)(nil))
if err = vm.RemoveDevice(false, cdroms...); err != nil {
ui.Error(fmt.Sprintf("error removing floppy: %v", err))
}
if s.uploadedFloppyPath != "" {
ds, err := d.FindDatastore(s.Datastore, s.Host)
if err != nil {
ui.Error(err.Error())
return
}
if err := ds.Delete(s.uploadedFloppyPath); err != nil {
ui.Error(fmt.Sprintf("Error deleting floppy image '%v': %v", s.uploadedFloppyPath, err.Error()))
return
}
}
}

32
iso/step_remove_cdrom.go Normal file
View File

@ -0,0 +1,32 @@
package iso
import (
"fmt"
"github.com/hashicorp/packer/packer"
"github.com/jetbrains-infra/packer-builder-vsphere/driver"
"github.com/mitchellh/multistep"
"github.com/vmware/govmomi/vim25/types"
)
type StepRemoveCDRom struct{}
func (s *StepRemoveCDRom) Run(state multistep.StateBag) multistep.StepAction {
ui := state.Get("ui").(packer.Ui)
vm := state.Get("vm").(*driver.VirtualMachine)
devices, err := vm.Devices()
if err != nil {
ui.Error(fmt.Sprintf("error removing cdroms: %v", err))
return multistep.ActionHalt
}
cdroms := devices.SelectByType((*types.VirtualCdrom)(nil))
if err = vm.RemoveDevice(false, cdroms...); err != nil {
ui.Error(fmt.Sprintf("error removing cdroms: %v", err))
return multistep.ActionHalt
}
return multistep.ActionContinue
}
func (s *StepRemoveCDRom) Cleanup(state multistep.StateBag) {}

49
iso/step_remove_floppy.go Normal file
View File

@ -0,0 +1,49 @@
package iso
import (
"fmt"
"github.com/hashicorp/packer/packer"
"github.com/jetbrains-infra/packer-builder-vsphere/driver"
"github.com/mitchellh/multistep"
"github.com/vmware/govmomi/vim25/types"
)
type StepRemoveFloppy struct {
Datastore string
Host string
UploadedFloppyPath string
}
func (s *StepRemoveFloppy) Run(state multistep.StateBag) multistep.StepAction {
ui := state.Get("ui").(packer.Ui)
vm := state.Get("vm").(*driver.VirtualMachine)
d := state.Get("driver").(*driver.Driver)
devices, err := vm.Devices()
if err != nil {
ui.Error(fmt.Sprintf("error removing floppy: %v", err))
return multistep.ActionHalt
}
cdroms := devices.SelectByType((*types.VirtualFloppy)(nil))
if err = vm.RemoveDevice(false, cdroms...); err != nil {
ui.Error(fmt.Sprintf("error removing floppy: %v", err))
return multistep.ActionHalt
}
if s.UploadedFloppyPath != "" {
ds, err := d.FindDatastore(s.Datastore, s.Host)
if err != nil {
ui.Error(err.Error())
return multistep.ActionHalt
}
if err := ds.Delete(s.UploadedFloppyPath); err != nil {
ui.Error(fmt.Sprintf("Error deleting floppy image '%v': %v", s.UploadedFloppyPath, err.Error()))
return multistep.ActionHalt
}
}
return multistep.ActionContinue
}
func (s *StepRemoveFloppy) Cleanup(state multistep.StateBag) {}