6d14eb6ea4
[Hyper-V] Use differential disks and Inline disk creation to improve build time (a lot) and to reduce disk usage(a lot)
90 lines
2.0 KiB
Go
90 lines
2.0 KiB
Go
package common
|
|
|
|
import (
|
|
"context"
|
|
"fmt"
|
|
"io/ioutil"
|
|
"path/filepath"
|
|
|
|
"github.com/hashicorp/packer/helper/multistep"
|
|
"github.com/hashicorp/packer/packer"
|
|
)
|
|
|
|
const (
|
|
vhdDir string = "Virtual Hard Disks"
|
|
vmDir string = "Virtual Machines"
|
|
)
|
|
|
|
type StepExportVm struct {
|
|
OutputDir string
|
|
SkipCompaction bool
|
|
SkipExport bool
|
|
}
|
|
|
|
func (s *StepExportVm) Run(_ context.Context, state multistep.StateBag) multistep.StepAction {
|
|
driver := state.Get("driver").(Driver)
|
|
ui := state.Get("ui").(packer.Ui)
|
|
var err error
|
|
var errorMsg string
|
|
|
|
vmName := state.Get("vmName").(string)
|
|
tmpPath := state.Get("packerTempDir").(string)
|
|
outputPath := s.OutputDir
|
|
expPath := s.OutputDir
|
|
|
|
// create temp path to export vm
|
|
errorMsg = "Error creating temp export path: %s"
|
|
vmExportPath, err := ioutil.TempDir(tmpPath, "export")
|
|
if err != nil {
|
|
err := fmt.Errorf(errorMsg, err)
|
|
state.Put("error", err)
|
|
ui.Error(err.Error())
|
|
return multistep.ActionHalt
|
|
}
|
|
if !s.SkipExport {
|
|
ui.Say("Exporting vm...")
|
|
|
|
err = driver.ExportVirtualMachine(vmName, vmExportPath)
|
|
if err != nil {
|
|
errorMsg = "Error exporting vm: %s"
|
|
err := fmt.Errorf(errorMsg, err)
|
|
state.Put("error", err)
|
|
ui.Error(err.Error())
|
|
return multistep.ActionHalt
|
|
}
|
|
// copy to output dir
|
|
expPath = filepath.Join(vmExportPath, vmName)
|
|
}
|
|
|
|
if s.SkipCompaction {
|
|
ui.Say("Skipping disk compaction...")
|
|
} else {
|
|
ui.Say("Compacting disks...")
|
|
err = driver.CompactDisks(expPath, vhdDir)
|
|
if err != nil {
|
|
errorMsg = "Error compacting disks: %s"
|
|
err := fmt.Errorf(errorMsg, err)
|
|
state.Put("error", err)
|
|
ui.Error(err.Error())
|
|
return multistep.ActionHalt
|
|
}
|
|
}
|
|
|
|
if !s.SkipExport {
|
|
ui.Say("Copying to output dir...")
|
|
err = driver.CopyExportedVirtualMachine(expPath, outputPath, vhdDir, vmDir)
|
|
if err != nil {
|
|
errorMsg = "Error exporting vm: %s"
|
|
err := fmt.Errorf(errorMsg, err)
|
|
state.Put("error", err)
|
|
ui.Error(err.Error())
|
|
return multistep.ActionHalt
|
|
}
|
|
}
|
|
return multistep.ActionContinue
|
|
}
|
|
|
|
func (s *StepExportVm) Cleanup(state multistep.StateBag) {
|
|
// do nothing
|
|
}
|