-
Notifications
You must be signed in to change notification settings - Fork 3.3k
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Merge pull request #5444 from vijayinvites/packer-vhdx
Hyperv vmcx builder and allow vhd/vhdx instead of ISO
- Loading branch information
Showing
16 changed files
with
2,713 additions
and
31 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,139 @@ | ||
package common | ||
|
||
import ( | ||
"fmt" | ||
"log" | ||
"path/filepath" | ||
"strings" | ||
|
||
"github.com/hashicorp/packer/packer" | ||
"github.com/mitchellh/multistep" | ||
) | ||
|
||
// This step clones an existing virtual machine. | ||
// | ||
// Produces: | ||
// VMName string - The name of the VM | ||
type StepCloneVM struct { | ||
CloneFromVMXCPath string | ||
CloneFromVMName string | ||
CloneFromSnapshotName string | ||
CloneAllSnapshots bool | ||
VMName string | ||
SwitchName string | ||
RamSize uint | ||
Cpu uint | ||
EnableMacSpoofing bool | ||
EnableDynamicMemory bool | ||
EnableSecureBoot bool | ||
EnableVirtualizationExtensions bool | ||
} | ||
|
||
func (s *StepCloneVM) Run(state multistep.StateBag) multistep.StepAction { | ||
driver := state.Get("driver").(Driver) | ||
ui := state.Get("ui").(packer.Ui) | ||
ui.Say("Cloning virtual machine...") | ||
|
||
path := state.Get("packerTempDir").(string) | ||
|
||
// Determine if we even have an existing virtual harddrive to attach | ||
harddrivePath := "" | ||
if harddrivePathRaw, ok := state.GetOk("iso_path"); ok { | ||
extension := strings.ToLower(filepath.Ext(harddrivePathRaw.(string))) | ||
if extension == ".vhd" || extension == ".vhdx" { | ||
harddrivePath = harddrivePathRaw.(string) | ||
} else { | ||
log.Println("No existing virtual harddrive, not attaching.") | ||
} | ||
} else { | ||
log.Println("No existing virtual harddrive, not attaching.") | ||
} | ||
|
||
// convert the MB to bytes | ||
ramSize := int64(s.RamSize * 1024 * 1024) | ||
|
||
err := driver.CloneVirtualMachine(s.CloneFromVMXCPath, s.CloneFromVMName, s.CloneFromSnapshotName, s.CloneAllSnapshots, s.VMName, path, harddrivePath, ramSize, s.SwitchName) | ||
if err != nil { | ||
err := fmt.Errorf("Error cloning virtual machine: %s", err) | ||
state.Put("error", err) | ||
ui.Error(err.Error()) | ||
return multistep.ActionHalt | ||
} | ||
|
||
err = driver.SetVirtualMachineCpuCount(s.VMName, s.Cpu) | ||
if err != nil { | ||
err := fmt.Errorf("Error creating setting virtual machine cpu: %s", err) | ||
state.Put("error", err) | ||
ui.Error(err.Error()) | ||
return multistep.ActionHalt | ||
} | ||
|
||
if s.EnableDynamicMemory { | ||
err = driver.SetVirtualMachineDynamicMemory(s.VMName, s.EnableDynamicMemory) | ||
if err != nil { | ||
err := fmt.Errorf("Error creating setting virtual machine dynamic memory: %s", err) | ||
state.Put("error", err) | ||
ui.Error(err.Error()) | ||
return multistep.ActionHalt | ||
} | ||
} | ||
|
||
if s.EnableMacSpoofing { | ||
err = driver.SetVirtualMachineMacSpoofing(s.VMName, s.EnableMacSpoofing) | ||
if err != nil { | ||
err := fmt.Errorf("Error creating setting virtual machine mac spoofing: %s", err) | ||
state.Put("error", err) | ||
ui.Error(err.Error()) | ||
return multistep.ActionHalt | ||
} | ||
} | ||
|
||
generation, err := driver.GetVirtualMachineGeneration(s.VMName) | ||
if err != nil { | ||
err := fmt.Errorf("Error detecting vm generation: %s", err) | ||
state.Put("error", err) | ||
ui.Error(err.Error()) | ||
return multistep.ActionHalt | ||
} | ||
|
||
if generation == 2 { | ||
err = driver.SetVirtualMachineSecureBoot(s.VMName, s.EnableSecureBoot) | ||
if err != nil { | ||
err := fmt.Errorf("Error setting secure boot: %s", err) | ||
state.Put("error", err) | ||
ui.Error(err.Error()) | ||
return multistep.ActionHalt | ||
} | ||
} | ||
|
||
if s.EnableVirtualizationExtensions { | ||
//This is only supported on Windows 10 and Windows Server 2016 onwards | ||
err = driver.SetVirtualMachineVirtualizationExtensions(s.VMName, s.EnableVirtualizationExtensions) | ||
if err != nil { | ||
err := fmt.Errorf("Error creating setting virtual machine virtualization extensions: %s", err) | ||
state.Put("error", err) | ||
ui.Error(err.Error()) | ||
return multistep.ActionHalt | ||
} | ||
} | ||
|
||
// Set the final name in the state bag so others can use it | ||
state.Put("vmName", s.VMName) | ||
|
||
return multistep.ActionContinue | ||
} | ||
|
||
func (s *StepCloneVM) Cleanup(state multistep.StateBag) { | ||
if s.VMName == "" { | ||
return | ||
} | ||
|
||
driver := state.Get("driver").(Driver) | ||
ui := state.Get("ui").(packer.Ui) | ||
ui.Say("Unregistering and deleting virtual machine...") | ||
|
||
err := driver.DeleteVirtualMachine(s.VMName) | ||
if err != nil { | ||
ui.Error(fmt.Sprintf("Error deleting virtual machine: %s", err)) | ||
} | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.