Enable use of separate temp path for Hyper-V VHD
This commit is contained in:
parent
3974976518
commit
028c941b77
|
@ -22,3 +22,4 @@ packer-test*.log
|
||||||
.idea/
|
.idea/
|
||||||
*.iml
|
*.iml
|
||||||
Thumbs.db
|
Thumbs.db
|
||||||
|
/packer.exe
|
|
@ -64,7 +64,7 @@ type Driver interface {
|
||||||
|
|
||||||
DeleteVirtualSwitch(string) error
|
DeleteVirtualSwitch(string) error
|
||||||
|
|
||||||
CreateVirtualMachine(string, string, int64, int64, string, uint) error
|
CreateVirtualMachine(string, string, string, int64, int64, string, uint) error
|
||||||
|
|
||||||
DeleteVirtualMachine(string) error
|
DeleteVirtualMachine(string) error
|
||||||
|
|
||||||
|
|
|
@ -166,8 +166,8 @@ func (d *HypervPS4Driver) CreateVirtualSwitch(switchName string, switchType stri
|
||||||
return hyperv.CreateVirtualSwitch(switchName, switchType)
|
return hyperv.CreateVirtualSwitch(switchName, switchType)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *HypervPS4Driver) CreateVirtualMachine(vmName string, path string, ram int64, diskSize int64, switchName string, generation uint) error {
|
func (d *HypervPS4Driver) CreateVirtualMachine(vmName string, path string, vhdPath string, ram int64, diskSize int64, switchName string, generation uint) error {
|
||||||
return hyperv.CreateVirtualMachine(vmName, path, ram, diskSize, switchName, generation)
|
return hyperv.CreateVirtualMachine(vmName, path, vhdPath, ram, diskSize, switchName, generation)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (d *HypervPS4Driver) DeleteVirtualMachine(vmName string) error {
|
func (d *HypervPS4Driver) DeleteVirtualMachine(vmName string) error {
|
||||||
|
|
|
@ -10,8 +10,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
type StepCreateTempDir struct {
|
type StepCreateTempDir struct {
|
||||||
TempPath string
|
TempPath string
|
||||||
dirPath string
|
VhdTempPath string
|
||||||
|
dirPath string
|
||||||
}
|
}
|
||||||
|
|
||||||
func (s *StepCreateTempDir) Run(state multistep.StateBag) multistep.StepAction {
|
func (s *StepCreateTempDir) Run(state multistep.StateBag) multistep.StepAction {
|
||||||
|
@ -34,6 +35,22 @@ func (s *StepCreateTempDir) Run(state multistep.StateBag) multistep.StepAction {
|
||||||
s.dirPath = packerTempDir
|
s.dirPath = packerTempDir
|
||||||
state.Put("packerTempDir", packerTempDir)
|
state.Put("packerTempDir", packerTempDir)
|
||||||
|
|
||||||
|
if s.VhdTempPath == "" {
|
||||||
|
// Fall back to regular temp dir if no separate VHD temp dir set.
|
||||||
|
state.Put("packerVhdTempDir", packerTempDir)
|
||||||
|
} else {
|
||||||
|
packerVhdTempDir, err := ioutil.TempDir(s.VhdTempPath, "packerhv-vhd")
|
||||||
|
if err != nil {
|
||||||
|
err := fmt.Errorf("Error creating temporary VHD directory: %s", err)
|
||||||
|
state.Put("error", err)
|
||||||
|
ui.Error(err.Error())
|
||||||
|
return multistep.ActionHalt
|
||||||
|
}
|
||||||
|
|
||||||
|
s.dirPath = packerVhdTempDir
|
||||||
|
state.Put("packerVhdTempDir", packerVhdTempDir)
|
||||||
|
}
|
||||||
|
|
||||||
// ui.Say("packerTempDir = '" + packerTempDir + "'")
|
// ui.Say("packerTempDir = '" + packerTempDir + "'")
|
||||||
|
|
||||||
return multistep.ActionContinue
|
return multistep.ActionContinue
|
||||||
|
|
|
@ -30,12 +30,13 @@ func (s *StepCreateVM) Run(state multistep.StateBag) multistep.StepAction {
|
||||||
ui.Say("Creating virtual machine...")
|
ui.Say("Creating virtual machine...")
|
||||||
|
|
||||||
path := state.Get("packerTempDir").(string)
|
path := state.Get("packerTempDir").(string)
|
||||||
|
vhdPath := state.Get("packerVhdTempDir").(string)
|
||||||
|
|
||||||
// convert the MB to bytes
|
// convert the MB to bytes
|
||||||
ramSize := int64(s.RamSize * 1024 * 1024)
|
ramSize := int64(s.RamSize * 1024 * 1024)
|
||||||
diskSize := int64(s.DiskSize * 1024 * 1024)
|
diskSize := int64(s.DiskSize * 1024 * 1024)
|
||||||
|
|
||||||
err := driver.CreateVirtualMachine(s.VMName, path, ramSize, diskSize, s.SwitchName, s.Generation)
|
err := driver.CreateVirtualMachine(s.VMName, path, vhdPath, ramSize, diskSize, s.SwitchName, s.Generation)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
err := fmt.Errorf("Error creating virtual machine: %s", err)
|
err := fmt.Errorf("Error creating virtual machine: %s", err)
|
||||||
state.Put("error", err)
|
state.Put("error", err)
|
||||||
|
|
|
@ -82,6 +82,11 @@ type Config struct {
|
||||||
EnableVirtualizationExtensions bool `mapstructure:"enable_virtualization_extensions"`
|
EnableVirtualizationExtensions bool `mapstructure:"enable_virtualization_extensions"`
|
||||||
TempPath string `mapstructure:"temp_path"`
|
TempPath string `mapstructure:"temp_path"`
|
||||||
|
|
||||||
|
// A separate path can be used for storing the VM's disk image. The purpose is to enable
|
||||||
|
// reading and writing to take place on different physical disks (read from VHD temp path
|
||||||
|
// write to regular temp path while exporting the VM) to eliminate a single-disk bottleneck.
|
||||||
|
VhdTempPath string `mapstructure:"vhd_temp_path"`
|
||||||
|
|
||||||
Communicator string `mapstructure:"communicator"`
|
Communicator string `mapstructure:"communicator"`
|
||||||
|
|
||||||
SkipCompaction bool `mapstructure:"skip_compaction"`
|
SkipCompaction bool `mapstructure:"skip_compaction"`
|
||||||
|
@ -296,7 +301,8 @@ func (b *Builder) Run(ui packer.Ui, hook packer.Hook, cache packer.Cache) (packe
|
||||||
|
|
||||||
steps := []multistep.Step{
|
steps := []multistep.Step{
|
||||||
&hypervcommon.StepCreateTempDir{
|
&hypervcommon.StepCreateTempDir{
|
||||||
TempPath: b.config.TempPath,
|
TempPath: b.config.TempPath,
|
||||||
|
VhdTempPath: b.config.VhdTempPath,
|
||||||
},
|
},
|
||||||
&hypervcommon.StepOutputDir{
|
&hypervcommon.StepOutputDir{
|
||||||
Force: b.config.PackerForce,
|
Force: b.config.PackerForce,
|
||||||
|
|
|
@ -187,27 +187,27 @@ Set-VMFloppyDiskDrive -VMName $vmName -Path $null
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
func CreateVirtualMachine(vmName string, path string, ram int64, diskSize int64, switchName string, generation uint) error {
|
func CreateVirtualMachine(vmName string, path string, vhdRoot string, ram int64, diskSize int64, switchName string, generation uint) error {
|
||||||
|
|
||||||
if generation == 2 {
|
if generation == 2 {
|
||||||
var script = `
|
var script = `
|
||||||
param([string]$vmName, [string]$path, [long]$memoryStartupBytes, [long]$newVHDSizeBytes, [string]$switchName, [int]$generation)
|
param([string]$vmName, [string]$path, [string]$vhdRoot, [long]$memoryStartupBytes, [long]$newVHDSizeBytes, [string]$switchName, [int]$generation)
|
||||||
$vhdx = $vmName + '.vhdx'
|
$vhdx = $vmName + '.vhdx'
|
||||||
$vhdPath = Join-Path -Path $path -ChildPath $vhdx
|
$vhdPath = Join-Path -Path $vhdRoot -ChildPath $vhdx
|
||||||
New-VM -Name $vmName -Path $path -MemoryStartupBytes $memoryStartupBytes -NewVHDPath $vhdPath -NewVHDSizeBytes $newVHDSizeBytes -SwitchName $switchName -Generation $generation
|
New-VM -Name $vmName -Path $path -MemoryStartupBytes $memoryStartupBytes -NewVHDPath $vhdPath -NewVHDSizeBytes $newVHDSizeBytes -SwitchName $switchName -Generation $generation
|
||||||
`
|
`
|
||||||
var ps powershell.PowerShellCmd
|
var ps powershell.PowerShellCmd
|
||||||
err := ps.Run(script, vmName, path, strconv.FormatInt(ram, 10), strconv.FormatInt(diskSize, 10), switchName, strconv.FormatInt(int64(generation), 10))
|
err := ps.Run(script, vmName, path, vhdRoot, strconv.FormatInt(ram, 10), strconv.FormatInt(diskSize, 10), switchName, strconv.FormatInt(int64(generation), 10))
|
||||||
return err
|
return err
|
||||||
} else {
|
} else {
|
||||||
var script = `
|
var script = `
|
||||||
param([string]$vmName, [string]$path, [long]$memoryStartupBytes, [long]$newVHDSizeBytes, [string]$switchName)
|
param([string]$vmName, [string]$path, [string]$vhdRoot, [long]$memoryStartupBytes, [long]$newVHDSizeBytes, [string]$switchName)
|
||||||
$vhdx = $vmName + '.vhdx'
|
$vhdx = $vmName + '.vhdx'
|
||||||
$vhdPath = Join-Path -Path $path -ChildPath $vhdx
|
$vhdPath = Join-Path -Path $vhdRoot -ChildPath $vhdx
|
||||||
New-VM -Name $vmName -Path $path -MemoryStartupBytes $memoryStartupBytes -NewVHDPath $vhdPath -NewVHDSizeBytes $newVHDSizeBytes -SwitchName $switchName
|
New-VM -Name $vmName -Path $path -MemoryStartupBytes $memoryStartupBytes -NewVHDPath $vhdPath -NewVHDSizeBytes $newVHDSizeBytes -SwitchName $switchName
|
||||||
`
|
`
|
||||||
var ps powershell.PowerShellCmd
|
var ps powershell.PowerShellCmd
|
||||||
err := ps.Run(script, vmName, path, strconv.FormatInt(ram, 10), strconv.FormatInt(diskSize, 10), switchName)
|
err := ps.Run(script, vmName, path, vhdRoot, strconv.FormatInt(ram, 10), strconv.FormatInt(diskSize, 10), switchName)
|
||||||
|
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|
Loading…
Reference in New Issue