packer-cn/builder/vmware/vmx/step_clone_vmx.go

63 lines
1.5 KiB
Go
Raw Normal View History

2013-12-26 10:34:27 -05:00
package vmx
import (
"fmt"
2013-12-26 10:34:27 -05:00
"log"
"path/filepath"
"github.com/mitchellh/multistep"
2013-12-26 16:39:41 -05:00
vmwcommon "github.com/mitchellh/packer/builder/vmware/common"
2013-12-26 10:34:27 -05:00
"github.com/mitchellh/packer/packer"
)
// StepCloneVMX takes a VMX file and clones the VM into the output directory.
type StepCloneVMX struct {
OutputDir string
Path string
VMName string
}
func (s *StepCloneVMX) Run(state multistep.StateBag) multistep.StepAction {
2013-12-26 16:39:41 -05:00
driver := state.Get("driver").(vmwcommon.Driver)
2013-12-26 10:34:27 -05:00
ui := state.Get("ui").(packer.Ui)
vmxPath := filepath.Join(s.OutputDir, s.VMName+".vmx")
2013-12-26 16:39:41 -05:00
ui.Say("Cloning source VM...")
2013-12-26 10:34:27 -05:00
log.Printf("Cloning from: %s", s.Path)
log.Printf("Cloning to: %s", vmxPath)
2013-12-26 16:39:41 -05:00
if err := driver.Clone(vmxPath, s.Path); err != nil {
2013-12-26 10:34:27 -05:00
state.Put("error", err)
return multistep.ActionHalt
}
vmxData, err := vmwcommon.ReadVMX(vmxPath)
if err != nil {
state.Put("error", err)
return multistep.ActionHalt
}
var diskName string
if _, ok := vmxData["scsi0:0.filename"]; ok {
diskName = vmxData["scsi0:0.filename"]
}
if _, ok := vmxData["sata0:0.filename"]; ok {
diskName = vmxData["sata0:0.filename"]
}
if _, ok := vmxData["ide0:0.filename"]; ok {
diskName = vmxData["ide0:0.filename"]
}
if diskName == "" {
err := fmt.Errorf("Root disk filename could not be found!")
state.Put("error", err)
return multistep.ActionHalt
}
state.Put("full_disk_path", filepath.Join(s.OutputDir, diskName))
2013-12-26 10:34:27 -05:00
state.Put("vmx_path", vmxPath)
return multistep.ActionContinue
}
func (s *StepCloneVMX) Cleanup(state multistep.StateBag) {
}